跟着大神的文章做下来的,良心佳作。跟随大神,略有改动。
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、基础配置
基础配置分别为:
- 允许所有机器访问
- template目录添加
- blog app应用注册
- 修改时区和语言
- 在项目目录添加media 和static (用于CSS和JS图片资源)
- 使用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')