Django入门的一个小案例

首先,创建一个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


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值