首先,创建一个Django项目,anli1
Django-admin startproject anli1
接着创建一个应用,bookhero
python manage.py startapp bookhero
创建完之后在setting.py中注册应用,
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'bookhero',
]
然后开始设计自己的数据库ORM模型生成数据表单,在models中创建一个图书信息类BookInfo,
class BookInfo(models.Model):
'''图书信息类'''
booktittle = models.CharField(max_length=20)
bookdata = models.DateField()
def __str__(self):
return self.booktittle
class Heros(models.Model):
'''英雄类'''
hname = models.CharField(max_length=20)
hskill = models.CharField(max_length=128)
hbook = models.ForeignKey(BookInfo)
def __str__(self):
return self.hname
然后生成迁移文件(数据表单) python manage.py makemigrations
报错:TypeError: __init__() missing 1 required positional argument: 'on_delete'
解决办法:
将第十一行的代码改为:
herobook=models.ForeignKey('BookInfo',on_delete=models.CASCADE,)
即在外键值的后面加上 on_delete=models.CASCADE
原因:
在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错:
TypeError: __init__() missing 1 required positional argument: 'on_delete'
举例说明:
user=models.OneToOneField(User)
owner=models.ForeignKey(UserProfile)
需要改成:
user=models.OneToOneField(User,on_delete=models.CASCADE) --在老版本这个参数(models.CASCADE)是默认值
owner=models.ForeignKey(UserProfile,on_delete=models.CASCADE) --在老版本这个参数(models.CASCADE)是默认值
参数说明:
on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值
CASCADE:此值设置,是级联删除。
PROTECT:此值设置,是会报完整性错误。
SET_NULL:此值设置,会把外键设置为null,前提是允许为null。
SET_DEFAULT:此值设置,会把设置为外键的默认值。
SET():此值设置,会调用外面的值,可以是一个函数。
一般情况下使用CASCADE就可以了。
接着执行迁移生成数据表 python manage.py migrate
注意:这里所用的数据库为自带的sqlite3,可以下载一个sqliteman的可视化文件来协助操作。
接着可以进行后台管理模块的设计了,首先需要在setting.py中对时区和语言进行修改
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
接着,创建超级管理员用户 python manage.py createsuperuser
设置好相关信息之后,我们开始在后台模块 admin.py 中注册模型类,
from django.contrib import admin
from .models import BookInfo,Heros
# Register your models here.
admin.site.register(BookInfo)
admin.site.register(Heros)
注册之后可以启动应用 python manage.py runserver
接着在浏览器的地址栏中输入 http://127.0.0.1:8000/admin
输入管理员信息验证正确之后,就可以进入后台界面,对生成的数据库进行增删改查的操作,我们在图书表中添加两本书,一本《奥特曼》一本《仙剑奇侠传》
人物添加五个,迪迦和赛罗对应到第一本书中
李逍遥、柳梦璃、慕容紫英对应到第二本书中,并填写相关信息
到了这里后台数据已经完成,接着就是完成用户交互的视图了!在这一步有三个东西需要完成:(顺序可以变,按个人习惯即可,建议先写视图函数)
1.定义视图
2.定义URLconf
3.定义模板
首先在views.py中定义视图函数
def index(request):
#遍历所有图书
booklist = BookInfo.objects.all()
# 将图书列表传递到模板(html视图文件中)中,然后渲染模板
return render(request,'index.html',{'booklist':booklist})
def detail(request,id):
#根据图书id对应相关人物
book = BookInfo.objects.get(id=int(id))
#查找图书中英雄的信息
heros = book.heros_set.all()
# 将图书列表传递到模板(html视图文件中)中,然后渲染模板
return render(request,'detail.html',{'heros':heros})
然后就可以开始配置路由了,首先定义项目中的url路由
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path(r'^admin/',admin.site.urls), # 配置项目
path(r'^', include('bookhero.urls')), # 包含应用中的urls文件]
接着配置应用中的路由,首先在应用中新建一个urls.py
from django.urls import path
#引入视图模块
from . import views
# 在应用的urls文件中进行url配置的时候:
# 1.严格匹配开头和结尾
urlpatterns = [
# 通过url函数设置url路由配置项
path(r'^$', views.index), # 建立/index和视图index之间的关系
# url(r'^books$', views.show_books), # 显示图书信息
path(r'^(\d+)/$', views.detail), # 显示英雄信息]
最后就可以在项目下新建一个模板文件templates来新建自己的HTML模板文件,这里我就不做解释了
这里有几点要注意:
1.不要忘记在setting.py中配置模板文件的路径
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
2.在新版的Django中只能用re_path才能使用正则匹配url
(因此上面的代码对于现在的版本是错的!)
3.'''
问题:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 9737: illegal multibyte sequence
解决办法:
找到 Django 源码 “Python安装路径(或者是虚拟环境路径)\lib\site-packages\django\views\debug.py” 332行位置,增加 utf-8 编码,问题解决
def get_traceback_html(self):
"""Return HTML version of debug 500 HTTP error page."""
with Path(CURRENT_DIR, 'templates', 'technical_500.html').open( encoding='utf-8' ) as fh:
t = DEBUG_ENGINE.from_string(fh.read())
c = Context(self.get_traceback_data(), use_l10n=False)
return t.render(c)
'''
最后还是启动应用即可 python manage.py runserver