• 9.5-9.9 小知识点


    目录

    1.什么是静态文件,django静态文件配置如何配置,如何解决接口前缀不断变化,html页面上路径的引用需要反复修改的问题

    2.request对象的方法有哪些,分别是干什么用的,请具体阐述细节及注意事项

    3.django自带的数据库是什么,如何换成其他数据库例如MySQL,如何配置更换

    4.什么是django orm,如何使用django orm,数据库迁移命令如何书写

    5.orm字段的增删改查与数据的增删改查如何实现

    1.表关系如何判定,django orm中如何建立表关系,有什么特点和注意事项

    2.请画出完整的django请求生命周期流程图

    ​编辑

    3.简述django路由层相关知识点

    1. 关于路由结尾的斜杠:

    2. path转换器

    3. re_path正则匹配

    3.1 正则匹配之无名分组

    3.2 正则匹配之有名分组

    4.  django版本区别

    5. 反向解析

    1. 路由对应关系起别名

    2. 使用反向解析语法

    6. 无名又名反向解析

    7. 路由分发

    名称空间

    解决方式

    1.必知必会14条都有哪些,每个都是干啥使的

    总结: 

    2.简述神奇的双下划线查询都有哪些方法,作用是什么

    3.针对多对多外键字段的增删改查方法有哪些,各有什么特点?

    4.什么是正反向的概念,及查询口诀,你能否总结一下正反向查询不同情况下点击不同字段的规律

    5.MySQL中的跨表查询如何实现,针对主动链表操作,你能否说一说每一种链表操作的具体特点

    ORM 外键字段创建的方式有哪些?

    1.你所知道的orm查询优化有哪些,各有什么特点

    2.choices参数的应用场景有哪些,如何获取该字段的值

    3.什么是ajax,请手写出ajax的基本语法结构。指出ajax发送json格式数据需要注意什么,发送包含文件类型数据又需要注意什么

    4.前后端传输数据编码格式有哪些,针对这些格式django后端有怎样的区别处理

    语法结构为

     Ajax携带文件数据

    1.聚合查询,分组查询的关键字各是什么,各有什么特点或者注意事项

    2.F与Q查询的功能,他们的导入语句是什么,针对Q有没有其他用法

    F查询

    Q 查询

    Q对象的进阶用法

    3.列举常见的数据库字段及主要参数(越多越好)

    常见字段

    ORM还支持自定义字段 

     ORM常见字段参数

    4.什么是事务,事务的特性有哪些,你是否了解数据库设计范式(列举三个即可)

    5.简要用文字描述出图书管理系统各个功能编写思路及注意点


    1.什么是静态文件,django静态文件配置如何配置,如何解决接口前缀不断变化,html页面上路径的引用需要反复修改的问题


    静态文件: 不会更改的文件, 如js,css,jq,img等
    配置:

    1. STATIC_URL=/'static'/
    2. STATICFILES_DIR = [os.path.join(BASE_DIR,'static']

    html方面:

    {% load static 文件绝对路径%}


    2.request对象的方法有哪些,分别是干什么用的,请具体阐述细节及注意事项

    request对象方法

    request.method 获取请求方式, 结果是纯大写的字符串

    request.POST  获取POST请求发送来的普通数据[不包含文件]

    request.POST.get()  默认值获取列表中最后一个数据

    request.POST.getlist()  获取键对用的整个列表, 无论有几个数据值

    request. GET  获取url?之后可以携带不超过2kb的非敏感数据.

     request.GET.get()  默认只获取列表中最后一个数据值

    request.GET.getlist()  获取键对应的整个列表, 无论有几个数据值

    3.django自带的数据库是什么,如何换成其他数据库例如MySQL,如何配置更换

    django自带的数据库是sqlit3, 只能做本地测试的小型关系型数据库,无法承受过大的数据量, 可以通过链接别的数据库进行操作, 如mysql, 

    pycharm右上角,左下角等地找到database, 然后进行链接, 第一次链接的时候会下载一个驱动[根据提示一步步操作即可], 后续无需再次下载.  输入用户名密码以及数据库之后apply>>>再test connection, 链接成功后按🆗即可.

    数据库配置
     

    1. DATABASES = {
    2.     'default': {
    3.         'ENGINE': 'django.db.backends.mysql',  # 指定数据库软件名称
    4.         'NAME': '',  # 指定库名
    5.         'USER': '', # 用户名
    6.         'PASSWORD': '', # 密码
    7.         'HOST': '127.0.0.1',
    8.         'PORT': 3306,
    9.         'CHARSET': 'utf8'
    10.     }
    11. }


    4.什么是django orm,如何使用django orm,数据库迁移命令如何书写

    ORM 对象关系映射表

    类名 >>>> 表名

    类属性>>>表里的字段

    类实例>>> 表里的一行行数据

    ====================================

    类 ---------->>> 表

    对象 -------->>> 表里面的数据

    对象点属性 -->>> 字段对应的值

    orm基本操作

    1. class Users(models.Model):
    2. uid = models.AutoField(primary_key=True) # 等价于uid int primary key auto_increment
    3. name = models.CharField(max_length=32) # 等价于name varchar(32)
    4. pwd = models.IntegerField() # 等价于pwd int

    数据库迁移命令:

            pycharm: models.py中, make migrations>>>migrate

            cmd: python manage.py make migrations>>> python manage.py mirgate

    5.orm字段的增删改查与数据的增删改查如何实现


    models.User.objects.filter() 
    models.User.objects.create()
    models.User.objects.filter(id=1).update(name='yietong666')
    models.User.objects.filter(id=4).delete()

    1.表关系如何判定,django orm中如何建立表关系,有什么特点和注意事项

    表关系的判断主要通过换位思考双方的关系的来的, 比如: 个人与个人信息是一对一关系, 班级与课程是一对多关系, 老师与课程是多对对关系等

    表关系的建立主要通过外键字段foreignkey来建立链接, 

    一对一表关系, ORM中外键关联字段 models.OneToOneField() , 会自动添加_id后缀

    一对多表关系, ORM中外键字段在多的一方, models.Foreignkey() 会自动添加_id

    多对多表关系,ORM中有三种创建多对对字段的方式, moels.ManyToManyField() 会自动添加_id后缀

            方式1: 直接在查询频率改的表中填写即可, 自动创建第三张表

            方式2 : 自己创建第三张表

            方式3: 自己创建第三张表关系, 但是还是需要orm多对多字段做关联. 

    注意事项:

    django1.x 针对models.ForeignKey()>>>> models.OneToOneField() 不需要on_delete字段, 而django2.x,3.x则需要添加on_delete字段. 


    2.请画出完整的django请求生命周期流程图

     django的生命周期是:前端请求--->nginx--->uwsgi.--->中间件--->url路由---->view视图--->orm---->拿到数据返回给view---->试图将数据渲染到模版中拿到字符串---->中间件--->uwsgi---->nginx---->前端渲染。
     

    3.简述django路由层相关知识点
     

    路由层是django框架除了中间件的第一层. 写在urls.py的urlpatterns列表中, 语法为path('网址后缀',函数名). 一旦网址后缀匹配上了, 就会自动执行后边的函数并结束整个路由的匹配. 

    1. 关于路由结尾的斜杠:

    默认情况下不写斜杠, django会做二次处理, 第一次匹配不上,会让浏览器加斜杠再次请求. 

    django配置文件中也可以指定是否自动添加斜杠APPEND-SLASH = False

    2. path转换器

    当网址后缀不固定的时候, 可以使用转换器来匹配

            'int':IntConverter()

            path': PathConverter(),
            'slug': SlugConverter(),
            'str': StringConverter(),
            'uuid': UUIDConverter(),

    path('func///'.views.func)

    转换器匹配到的内容会被当作视图函数的关键字参数传入, 转换器有几个那么视图函数的形参就必须对应.>>> def func(request,year,info):pass

    3. re_path正则匹配

    re_path(正则表达式,函数名)

    一旦网址后缀的正则能够匹配到内容就会自动执行后面的函数, 并结束整个路由的匹配

    当网址后缀不固定时, 可以使用转换器来匹配

    3.1 正则匹配之无名分组

    re_path('^test/(\d+)/',views.test)  正则表达式匹配到的内容就会当作视图函数的位置参数传递给视图函数

    3.2 正则匹配之有名分组

    re_path('^test/(?P\d+)/(?P.*?)/',views.test)

    正则表达式匹配到的内容会当作视图函数的关键字参数传递给视图函数

    4.  django版本区别

    在1.x版本中, 之指出正则匹配,并且方法是url

    2/3/4中, path(), re_path()等价于url()

    5. 反向解析

    反向解析的出现是为了防止写死的路由中途出现变化导致所有页面的相关链接失效, >>>>>>

    反向解析返回一个结果, 该结果可以访到对应的路由

    具体措施为:

    1. 路由对应关系起别名

    path('register/',views.reg,name='reg_view')

    2. 使用反向解析语法

    html页面上:

    {% url 'reg_view' %}

    后端:

    1. from django.shortcuts import reverse    
    2. reverse('reg_view')

    反向解析的操作三个方法都一样(path() / re_path()/ url()

    6. 无名又名反向解析

    path('reg//',views.reg,name='reg_view')

    当路由中有不确定的匹配因素, 反向解析的时候需要认为给出一个具体的值

    reverse('reg_view',args=('yietong'.))
    {% 'reg_view', 'yietong'%}

    7. 路由分发

    django 中的应用都可以又自己独立的urls.py  templates文件夹, static文件夹, 能换个让基于django开发的多个应用完全独立, 便于小组开发

    总路由

    1. path('app01/',include('app01.urls')),
    2. path('app02/',include('app02.urls')),

    子路由

    1. path('after/',views.after) # app01
    2. path('after/',views.after) # app02

    当项目很大, 应用很多的时候使用路由分发特别方便

    名称空间

    路由分发场景下多个应用涉及到反向解析别名冲突的时候无法正常解析而出现的

    解决方式

    1. 名称空间 namespace

    1. path('app01/', include(('app01.urls', 'app01'), namespace='app01'))
    2. path('app01/', include(('app01.urls', 'app02'), namespace='app02'))

    2. 别名不要冲突

    1.必知必会14条都有哪些,每个都是干啥使的

    all() >>> 查询所有结果

    filter(**kwargs) >>> 它包含了与所给筛选条件相匹配的对象

    get(**kwargs)>>> 返回与所给筛选条件相匹配的对象, 返回结果有且只有一个,如果符合筛选条件的对象超过IP一个或者一个都没有就会报错, 所以布套推荐使用, 可以使用first()来代替

    exclude(**kwargs) >>> 包含了与所给筛选条件不匹配的对象

    values(*field)>>> 返回一个valuequeryset对象,----一个特殊的QuerySet, 运行后得到的并不是一些列model的实例化对象, 而是一个可迭代的字典序列

    value_list(*field)>>> 他与value()非常相似, 他返回的是一个元组序列, values返回的是一个字典

    order_by(): >>> 对查询结果排序

    reverse()>>> 对查询结果反向排序, 请注意, reverse() 通常只能在具有已定义顺序的QuerySet上调用,[ 在model类的meta中指定ordering 或者调用order_by()方法 ]

    distinct()>>>> 从返回结果中提出重复记录,如果查询跨越多个表, 可能在计算QuerySet时得到重复的结果, 此时可以使用distinct(), 注意 只有在PostgreSQL中支持按字段去重

    count()>>>> 返回数据库中匹配查询QuerySet的对象数量

    first()>>> 返回第一条记录

    last()>>> 返回最后一条记录

    exists() >>> 如果QuerySet包含数据, 就返回True, 否则返回False.

    总结: 

    返回QuerySet对象的方法有

    all(), filter(), exclude(), order_by(), reverse(), distinct()

    特殊的QuerySet

    values() 返回一个可迭代的字段序列

    values_list()  返回一个可迭代的元组序列

    返回具体对象

    get(), first(), last()

    返回布尔值的方法

    exists()

    返回数字的方法

    count()


    2.简述神奇的双下划线查询都有哪些方法,作用是什么

    __gr  >>> 大于

    __gte >>> 大于等于

    __lt >>> 小于

    __lte >>> 小于等于

    __in >>> 成员运算

    __range >>> 判断范围[数字]

    模糊查询:

            字段__contains >>> 不忽略大小写

            字段__icontains >>> 忽略大小写

    日期处理

            字段__year

            字段__month

            字段__day

            


    3.针对多对多外键字段的增删改查方法有哪些,各有什么特点?

    add() >>> 添加数据, 括号内既可以填写数字值, 也可以填写数据对象, 支持多个

    remove() >>> 删除数据, 括号内既可以填写数字值也可以填写数据对象, 支持多个

    set() >>> 修改数据, 括号内必须时可迭代对象

    clear() >>> 清空指定数据, 括号内不需要任何参数


    4.什么是正反向的概念,及查询口诀,你能否总结一下正反向查询不同情况下点击不同字段的规律

    正反向概念的核心在于外键字段在哪里

    正向查询>>> 通过书查询出版社, 外键字段在书表中

    反向查询>>> 通过出版社查询书籍, 外键字段在书籍表中

    有一个跨表查询的小窍门>>> 正向查询按照外键字段, 反向查询按照表名小写


    5.MySQL中的跨表查询如何实现,针对主动链表操作,你能否说一说每一种链表操作的具体特点

    跨表查询通过关联外键实现的, 

    ORM 外键字段创建的方式有哪些?

     一对多:

    ORM中外键字段在多的一方>>> models.ForeignKey() 会自动添加_id后缀

    多对多:

    ORM 中有三种创建字段的方式>>> models.ManyToManyField()

            1.直接在查询频率搞得表中填写字段即可, django会自动创建第三张表关系

    authors = models.ManyToManyField(to='Author')
    

            优点: 第三张表自动创建, 缺点: 第三张表扩展性差 

            2. 自己创建第三张表

    1. class Book(models.Model):
    2. pass
    3. class Author(model.Model):
    4. pass
    5. class Book2Author(models.Model):
    6. book_id = models.ForeignKey(to='Book')
    7. models.ForeignKey(to='Book')
    8. models.ForeignKey(to='Author')

             优点: 第三张表扩展性强, 缺点: 无法使用正反向查询以及多对多四个方法

            3.自己创建第三张表关系, 但是还要orm多对多字段做关联

    1. class Book(models.Model):
    2. authors = models.ManyToManyField(
    3. to='Author',
    4. through='Book2Author',
    5. through_fields=('book_id','author_id')
    6. )
    7. class Author(models.Model):
    8. pass
    9. class Book2Author(models.Model):
    10. book_id = models.ForeignKey(to='Book')
    11. author_id = models.ForeignKey(to='Author')

    优点: 扩展性强并且支持正反向查询,    缺点: 无法使用多对多的四个方法

    一对一:

    ORM中外键字段建在查询频率较高的表中 >>> models.OneToOneField()会自动添加_id后缀

    ps: Django 1.x中 针对models.ForeignKey(), models.OneToOneField()不需要添加on_delete=models.CASCADE, 而django2.x, 3.x中需要自己添加

    1.你所知道的orm查询优化有哪些,各有什么特点

    django orm 默认都是惰性查询, 当orm的语句在后续的代码中真正需要使用的时候才会展示,    django orm 自带有limit分页(默认21页)功能, 用以减轻数据库端以及服务端的压力

    ORM的优化操作有only 与 defer 和 select_related 与 prefetch_related

    only 会将括号里填写的字段封装成一个个数据对象,对象在点击的时候不会再走数据库查询,

    对象也可以惦记括号内没有的字段, 只不过这个时候每次查询都会走数据库.

    defer刚好与之相反. >>> 数据对象惦记括号内出现的字段, 每次都会走数据库查询, 

    点击括号内没有的字段,不会走数据库查询. 

    select_related 括号内只能接收外键字段, (一对一, 一对多)自动链表, 得出的数据对象再点击表中数据的时候都不会再走数据库查询

    prefetch_related 底层其实是子查询, 将查询之后的结果也一次性封装到数据对象中, 用户在使用的时候是感觉不出来的


    2.choices参数的应用场景有哪些,如何获取该字段的值

    当字段数据的可能性是可以完全列举出来的时候, 应该考虑使用choices参数. 如性别,学历,成绩等

    1. class UserInfo(models.Model);
    2. username = models.CharField(max_length=32)
    3. gender_choice = (
    4. (1,'male'),
    5. (2,'female'),
    6. (3,'otrher'),
    7. )
    8. gender = models.IntegerField(choices=gender_choice)
    9. userinfo_obj.get_gender_display()

    3.什么是ajax,请手写出ajax的基本语法结构。指出ajax发送json格式数据需要注意什么,发送包含文件类型数据又需要注意什么

    4.前后端传输数据编码格式有哪些,针对这些格式django后端有怎样的区别处理
     

    ajax是js自带的功能,其特点为: 异步提交,局部刷新

    语法结构为

    1. $.ajax({
    2. url:'', // 控制数据的提交地址
    3. type:'', // 控制请求方式, 默认是get 请求
    4. data:{}, // 组织提交的数据
    5. success:function(args){
    6. 异步回调函数
    7. }
    8. })

    发送数据编码的格式有四种

    Content-Type

    格式1: urlencoded   

    name='yietong'&pwd=123&hobby=read

    django后端会统一处理到request.POST中

    格式2: formdata

    数据格式无法查阅, django后端自动将文件数据处理到request.FILES中,  将普通数据处理到request.POST中,

    格式3:application/json

    数据格式: json格式

    django后端不会处理, 再request.body中存储(bytes类型)自己处理. 

    语法注意事项
     

    1. data:JSON.stringfy({'name':'yietong''pwd':123}),
    2. contentType:'application/json',

     Ajax携带文件数据

    1. $.('#d3').click(function(){
    2. //1. 产生内置对象
    3. let formData = new FormData();
    4. // 2. 添加普通数据
    5. formData.append('username',$('#d1).val())
    6. // 3. 添加文件数据
    7. formData.append('file',$('#d2')[0].files[0]
    8. // 4. 发送ajax请求
    9. $.ajax({
    10. url:'',
    11. type:'post',
    12. data:formaData,
    13. contentType:false, // 不使用任何编码
    14. success:function(args){}
    15. })
    16. })

    回调函数

    后端跟ajax交互, 不应该再返回首页, 通常情况下都是返回json核实数据.. 前端针对HttpResponse和JsonResponse返回的json格式数据处理策略不同

    前者不会自动反序列化, 后者会自动反序列化. 

    如果想让前者页自动反序列化, 可以添加应该固定的参数>>> dataTyp:'JSON'


    1.聚合查询,分组查询的关键字各是什么,各有什么特点或者注意事项

    聚合查询是没有分组之前的查询, 关键字为aggregate,  from django.db.models import Max,Min,Sum,Avg,Count

    分组之后查询的关键字为annotate

    按照整条数据分组语句为>>> models.Book.objects.annotate()

    按照表中某个字段分组语句为>>> models.book.objects.values('title').annotate(),  按照的是annotate之前的values括号中指定的字段分组


    2.F与Q查询的功能,他们的导入语句是什么,针对Q有没有其他用法

    F查询

    from django.db.models import F

    查询条件不是自定义的而是来自于表中的其他字段. 例如将书本加上固定字样格式, 上调价格等,

    但是由于字符串无法直接进行拼接, 使用需要导入模块

    1. from django.db.models.functions import Concat
    2. from django.db.models import Value
    3. res = models.book.objects.filter(pk=5).update(title=Concat(F('title'),Value('中秋快乐')))

    Q 查询

    from django.db.models import Q

    使用Q对象, 可以支持逻辑运算符>>> 逗号是and关系, | 管道符是or关系, ~波浪号是not关系

    Q对象的进阶用法

    当我们需要一个搜索功能, 并且条件由用户指定, 这时候需要将搜索内容变成字符串,

    1. q_obj = Q()
    2. q_obj.connector = 'or'   # 默认是and 可以改成or 
    3. q_obj.children.append(('price__gt',200))
    4. res = models.Book.objects.filter(q_obj)
    5. print(res.query)


    3.列举常见的数据库字段及主要参数(越多越好)

    常见字段

    AutoField()
    CharField()
    IntegerField()
    BigIntegerField()
    DateField()
    DateTimeField()
    DecimalField()
    EmailField()
    BooleanField()
        传布尔值存数字0或1
    TextField()
        存储大段文本
    FileField()
        存储文件数据  自动找指定位置存储 字段存具体路径
    ForeignKey()
    OneToOneField()
    ManyToManyField()   

    ORM还支持自定义字段 

    1. class MyCharField(models.Field):
    2.     def __init__(self, max_length, *args, **kwargs):
    3.         self.max_length = max_length
    4.         super().__init__(max_length=max_length, *args, **kwargs)
    5. def db_type(self, connection):
    6. return 'char(%s)' % self.max_length
    7. info = MyCharField(max_length=32)

     ORM常见字段参数

     max_length
    verboses_name
    auto_now
    auto_now_add
    null
    default
    max_digits
    decimal_places
    unique=True
    db_index=True

    to
    to_field
    related_name


    choices
        当字段数据的可能性是可以完全列举出来的时候 应该考虑使用该参数
            性别
            学历
            成绩  
            

    1.     class UserInfo(models.Model):
    2.         username = models.CharField(max_length=32)
    3.         gender_choice = (
    4.             (1, '男性'),
    5.             (2, '女性'),
    6.             (3, '其他'),
    7.         )
    8.         gender = models.IntegerField(choices=gender_choice)
    9.     userinfo_obj.get_gender_display()


       
    on_delete


        1、models.CASCADE
            级联操作,当主表中被连接的一条数据删除时,从表中所有与之关联的数据同时被删除
        2、models.SET_NULL
            当主表中的一行数据删除时,从表中所有与之关联的数据的相关字段设置为null,此时注意定义外键时,这个字段必须可以允许为空
        3、models.PROTECT
            当主表中的一行数据删除时,由于从表中相关字段是受保护的外键,所以都不允许删除
        4、models.SET_DEFAULT
            当主表中的一行数据删除时,从表中所有相关的数据的关联字段设置为默认值,此时注意定义外键时,这个外键字段应该有一个默认值
        5、models.SET()
            当主表中的一条数据删除时,从表中所有的关联数据字段设置为SET()中设置的值,与models.SET_DEFAULT相似,只不过此时从表中的相关字段不需要设置default参数
        6、models.DO_NOTHING
            什么都不做,一切都看数据库级别的约束,注数据库级别的默认约束为RESTRICT,这个约束与django中的models.PROTECT相似

    4.什么是事务,事务的特性有哪些,你是否了解数据库设计范式(列举三个即可)

    事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有四个属性,称为原子性、一致性、隔离性和持久性 (ACID) 属性,只有这样才能成为一个事务。事务一般都是与数据库打交道的操作.

    为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。

    范式简单理解即为:一张数据表的设计结构需要满足的某种设计标准的级别。

    • 第一范式(确保每列保持原子性).无重复的列
    • 第二范式(确保表中的每列都和主键相关).属性完全依赖于主键
    • 三范式(确保每列都和主键列直接相关,而不是间接相关.属性不能传递依赖于主属性(属性不依赖于其它非主键属性)

    第一范式是最基本的范式。1NF是对属性的原子性,要求属性具有原子性,不可再分解;

    如学生(学号,姓名,性别,出生年月日),如果认为最后一列还可以再分成(出生年,出生月,出生日),它就不是一范式了,否则就是

    第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

    2NF是对记录的唯一性,要求记录有唯一标识,即实体的唯一性,即不存在部分依赖

    第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

    如果一个关系属于第二范式,并且在两个(或多个)非主键属性之间不存在函数依赖。(非主键属性之间的函数依赖也称为传递依赖),那么这个关系属于第三范式。

    3NF是对字段的冗余性,要求任何字段不能由其他字段派生出来,它要求字段没有冗余,即不存在传递依赖

    一般地,在进行数据库设计时,应遵循三大原则,也就是我们通常说的三大范式,即第一范式要求确保表中每列的原子性,也就是不可拆分;第二范式要求确保表中每列与主键相关,而不能只与主键的某部分相关(主要针对联合主键),主键列与非主键列遵循完全函数依赖关系,也就是完全依赖;第三范式确保主键列之间没有传递函数依赖关系,也就是消除传递依赖。


    5.简要用文字描述出图书管理系统各个功能编写思路及注意点

    1. 创建django项目以及配置各种基础设置信息

    2. 模型类的创建以及数据准备

    3. 首页搭建

            巨幕, 侧边栏,导航条, 图片展示

    4. 书籍展示页搭建

            模板继承 extend, block,, select_related, 过滤器, 标签

    5.书记添加页搭建

            from表单, create(), add()

    6. 书籍编辑页搭建

            form表单, update(0, set()

    7, 书籍删除页搭建

            return false

  • 相关阅读:
    侧链到底是什么
    通配符SSL证书价格贵吗
    ZigBee 3.0理论教程-通用-1-11:安全加密-网络层(NWK)安全
    《C Primer Plus》第10章复习题与编程练习
    Hexagon_V65_Programmers_Reference_Manual(26)
    安装程序2502/2503错误的解决方法
    django填充pyechart的图到前端模版中(不使用Ajax,而是直接贴一个div)
    第八章 动态规划 3 AcWing 1554. 找更多硬币
    Python之字符串分割替换移除
    【Python】Pycharm中设置使用conda的虚拟环境(保姆级图文)
  • 原文地址:https://blog.csdn.net/weixin_67531112/article/details/126706772