注意:一个项目基本都设计增删改查,且第一个需要做的就是设计表结构
思维导图:
组件使用: Django + bootStrap + Jquery
数据库表结构设计:
外键关联: 2种方式,
1. oneTooneField -->底层也是ForenignKey,但是有Unique限制
2. ForeingnKey
Django自带的用户认证模块:
from django.contrib.auth.models import User
user = models.OneToOneField(User, on_delete=True) # 相当于继承了auth.models里面的User表
注意多对多是不能在列上显示的
项目问答
问: 为什么是request.user?
答: 这里是利用了Django自带认证系统,前端模板里嵌套了request对象,除了获取request.user还可以获取request.method等方法。
如果是自定义的User【未继承auth.model】,想在前端利用request.userprofile获取用户信息,则需要在request对象里面添加userprofile对象的信息
models.py
问:为什么是request.user.userprofile.roles.all ?
答:因为Django中只能从request属性中获取user[这里的user是Django封装后,auth里面的user],而user和userprofiel是一对一的外键关系,所以这里是反向查值,一对一的反向不是【字段名_set】来获取的,而是根据request.user.userprofile获取,再拿到账号信息后根据多对多的Role查找角色信息最后找到menus菜单信息。
index.html
models.py
问: 为什么是 {% url menu.url %} ?
答: 因为{% url menu.url %}是个URL,而{{ menu.url }}仅仅显示一个字符串
Index.html中{% url menu.url %}显示效果:
Index.html中{{ menu.url }}显示效果:
问:为什么要在urls.py里面写别名?
答: 因为我们生成动态菜单的时候,是根据url来跳转对应的界面的,如果这里不写别名的话,则需要在a表的href里面写死url路径,不方便后期的维护。