跟着大神的文章做下来的,良心佳作。跟随大神,略有改动。

https://www.django.cn/course/show-40.html

把过程写一遍,加强理解。虚拟环境需要使用python 3.5/6/7/8 ,django 2.1.1

1、创建项目与应用

在虚拟环境中创建项目与应用

激活虚拟环境
D:\django_basic_venv\Scripts>activate

查看django版本,如果环境不匹配直接pip install django==2.1.1安装
(django_basic_venv) D:\django_basic_venv\Scripts\myblog2>python -c "import django; print(django.get_version())"
2.1.1

创建myblog2项目
D:\django_basic_venv\Scripts>django-admin.exe startproject myblog2

在myblog2下创建app blog
cd myblog2
python manage.py startapp blog

项目结构:
blog                #APP应用名和目录
│  admin.py        #对应应用后台管理配置文件。
│  apps.py         #对应应用的配置文件。
│  models.py       #数据模块,数据库设计就在此文件中设计。后面重点讲解
│  tests.py        #自动化测试模块,可在里面编写测试脚本自动化测试
│  views.py        #视图文件,用来执行响应代码的。你在浏览器所见所得都是它处理的。
│  __init__.py
│
├─migrations        #数据迁移、移植文目录,记录数据库操作记录,内容自动生成。
│  │  __init__.py
myblog2               #项目配置目录
│  __init__.py       #初始化文件,一般情况下不用做任何修改。
│  settings.py        #项目配置文件,具体如何配置后面有介绍。
│  url.py             #项目URL设置文件,可理解为路由,可以控制你访问去处。
│  wsgi.py          #为Python服务器网关接口,是Python与WEB服务器之间的接口。
myblogvenv            #Pycharm创建的虚拟环境目录,和项目无关,不需要管它。
templates           #项目模板文件目录,用来存放模板文件
manage.py     #命令行工具,通过可以与项目与行交互。在终端输入python manege.py help,可以查看功能。

2、基础配置

基础配置分别为:

  1. 允许所有机器访问
  2. template目录添加
  3. blog app应用注册
  4. 修改时区和语言
  5. 在项目目录添加media 和static (用于CSS和JS图片资源)
  6. 使用mysql数据库(保证可以连接到mysql)
vim myblog2/settings.py
#允许所有机器访问
ALLOWED_HOSTS = ['*']
#增加app
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog.apps.BlogConfig',    #add, 注册app应用 blog
]
#templates修改
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        #'DIRS': [],
        'DIRS': [os.path.join(BASE_DIR, 'templates')],   #新增内容
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
#'DIRS': [os.path.join(BASE_DIR, 'templates')], 注解:
BASE_DIR 是manage.py文件所在路径
os.path.join()函数把两个或者多个路径拼接为一个路径,第一个位置参数是第一个路径,后面代表路径组件的可变参数。执行完,拼接好的路径返回

#时间和语言
LANGUAGE_CODE = 'zh-hans'    #中文支持

TIME_ZONE = 'Asia/Shanghai'   #改为上海

USE_I18N = True

USE_L10N = True

USE_TZ = True

#静态资源添加
设置静态文件夹目录的路径
STATICFILES_DIRS = [(os.path.join(BASE_DIR, 'static'))]
#设置文件上传路径,图片上传、文件上传都会存放在此目录里
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

#数据库配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  #使用mysql数据库
        'NAME': 'blog',   
        'USER': 'root',
        'PASSWORD': 'xxxxxx',
        'HOST': '192.168.1.192',
        'PORT': '3306',
    }
}

3、创建欢迎页面

打开terminal页面并执行同步数据库命令如下:

python manage.py makemigrations  
python manage.py migrate

进入数据库查看表

mysql> show tables;
+----------------------------+
| Tables_in_blog             |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| blog_article               |
| blog_article_tags          |
| blog_banner                |
| blog_category              |
| blog_link                  |
| blog_tag                   |
| blog_tui                   |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
+----------------------------+
17 rows in set (0.01 sec)

访问测试页面

python manage.py runserver
http://127.0.0.1:8000/   #出现飞天火箭

制作helloworld访问页面

#编缉urls.py ,页面接收
myblog2/blog/urls.py

from django.contrib import admin
from django.urls import path
from blog import views         #从应用blog导入视图 
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.hello),   #hello
]
#编缉应用视图
vim myblog2/blog/views.py

from django.http import HttpResponse
def hello(request):
    return HttpResponse('欢迎使用Django!')

#访问admin页面

python manage.py createsuperuser
admin/admin
http://127.0.0.1:8000/admin #可以直接登陆进入页面

4、创建数据库模型

以下内容可参考,我是先做出结果后再理解

分类表结构设计:
表名:Category、分类名:name
标签表设计:
表名:Tag、标签名:name
文章表结构设计:
表名:Article、标题:title、摘要:excerpt、分类:category、标签:tags、推荐位、内容:body、创建时间:created_time、作者:user、文章封面图片img
幻灯图表结构设计:
表名:Banner、图片文本text_info、图片img、图片链接link_url、图片状态is_active。
推荐位表结构设计:
表名:Tui、推荐位名name。
友情链接表结构设计:
表名:Link、链接名name、链接网址linkurl。
其中:
文章和分类是一对多的关系,文章和标签是多对多的关系,文章和作者是一对多的关系,文章和推荐位是一对多关系(看自己的需求,也可以设计成多对多)。

#编缉应用中的模型 vim blog/models.py(从pycharm中复制内容)

from django.db import models
from django.contrib.auth.models import User
# Create your models here.

class Category(models.Model):
    name = models.CharField('博客分类',max_length=100)
    index = models.IntegerField(default=999,verbose_name='分类排序')

    class Meta:
        verbose_name = '博客分类'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

#文章标签

class Tag(models.Model):
    name = models.CharField('文章标签',max_length=100)
    class Meta:
        verbose_name = '文章标签'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

#推荐位
class Tui(models.Model):
    name = models.CharField('推荐位', max_length=100)

    class Meta:
        verbose_name = '推荐位'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

#文章
class Article(models.Model):
    title = models.CharField('标题',max_length=70)
    excerpt = models.TextField('摘要',max_length=200,blank=True)
    category = models.ForeignKey(Category,on_delete=models.DO_NOTHING,verbose_name='分类',blank=True,null=True)
    #使用外键关联分类表与分类是一对多关系
    tags = models.ManyToManyField(Tag,verbose_name='标签',blank=True)
    #使用外键关联标签表与分类是一对多关系
    img = models.ImageField(upload_to='article_img/%Y/%m/%d',verbose_name='文章图片',blank=True,null=True)
    body = models.TextField()
    user = models.ForeignKey(User, on_delete=models.CASCADE,verbose_name='作者')
    views = models.PositiveIntegerField('阅读量',default=0)
    tui = models.ForeignKey(Tui, on_delete=models.DO_NOTHING,verbose_name='推荐位', blank=True,null=True)

    created_time = models.DateTimeField('发布时间', auto_now_add=True)
    modified_time = models.DateTimeField('修改时间', auto_now=True)

    class Meta:
        verbose_name = '文章'
        verbose_name_plural = '文章'

    def __str__(self):
        return self.title

#banner
class Banner(models.Model):
    text_info = models.CharField('标题', max_length=50, default='')
    img = models.ImageField('轮播图', upload_to='banner/')
    link_url = models.URLField('图片链接', max_length=100)
    is_active = models.BooleanField('是否active', default=False)

    def __str__(self):
        return self.text_info

    class Meta:
        verbose_name = '轮播图'
        verbose_name_plural = '轮播图'

#友情链接
class Link(models.Model):
    name = models.CharField('链接名称', max_length=20)
    linkurl = models.URLField('网址', max_length=100)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = '友情链接'
        verbose_name_plural = '友情链接'

#同步数据到mysql

1、执行
D:\django_basic_venv\Scripts\myblog2>python manage.py makemigrations
Migrations for 'blog':
  blog\migrations\0001_initial.py
    - Create model Article
    - Create model Banner
    - Create model Category
    - Create model Link
    - Create model Tag
    - Create model Tui
    - Add field category to article
    - Add field tags to article
    - Add field tui to article
    - Add field user to article
2、执行
D:\django_basic_venv\Scripts\myblog2>python manage.py migrate
......未纪录下

5、admin 管理数据后台

注册APP应用之后,我们想要在admin后台里对数据库表进行操作,我们还得在应用APP下的admin.py文件里对数据库表先进行注册。我们的APP应用是blog,所以我们需要在blog/admin.py文件里进行注册: vim blog/admin.py

from .models import Banner, Category, Tag, Tui, Article, Link
from blog.models import Banner, Category, Tag, Tui, Article, Link
# Register your models here.

#导入需要管理的数据库表
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    list_display = ('id', 'category', 'title', 'tui', 'user', 'views', 'created_time')
    # 文章列表里显示想要显示的字段
    list_per_page = 50
    #满50条数据就自动分页
    ordering = ('-created_time',)
    #后台数据列表排序方式
    list_display_links = ('id','title')
    #设置哪些字段可以点击进入编缉界面

@admin.register(Banner)
class BannerAdmin(admin.ModelAdmin):
    list_display = ('id', 'text_info', 'img', 'link_url', 'is_active')

@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    list_display = ('id', 'name', 'index')

@admin.register(Tag)
class TagAdmin(admin.ModelAdmin):
    list_display = ('id', 'name')

@admin.register(Tui)
class TuiAdmin(admin.ModelAdmin):
    list_display = ('id', 'name')

@admin.register(Link)
class LinkAdmin(admin.ModelAdmin):
    list_display = ('id', 'name', 'linkurl')

6、访问管理平台

image.png