一、目标及业务流程
期望效果:
业务流程:
- 用户登录
- 预定会议室
- 退订会议室
- 选择日期;今日以及以后日期
二、表结构设计和生成
1、models.py(用户继承AbstractUser)
- from django.db import models
- # Create your models here.
- from django.db import models
- from django.contrib.auth.models import AbstractUser
-
- class UserInfo(AbstractUser):
- """用户信息表"""
- tel = models.CharField(max_length=32)
-
- class Room(models.Model):
- """会议室表"""
- caption = models.CharField(max_length=32) # 会议室名字
- num = models.IntegerField() # 会议室容纳人数
- def __str__(self):
- return self.caption
-
- class Book(models.Model):
- """会议室预订信息"""
- user = models.ForeignKey("UserInfo", on_delete=models.CASCADE) # CASCADE级联删除
- room = models.ForeignKey("Room", on_delete=models.CASCADE)
- date = models.DateField() # 日期
- time_choices = ( # 时段
- (1, '8:00'),
- (2, '9:00'),
- (3, '10:00'),
- (4, '11:00'),
- (5, '12:00'),
- (6, '13:00'),
- (7, '14:00'),
- (8, '15:00'),
- (9, '16:00'),
- (10, '17:00'),
- (11, '18:00'),
- (12, '19:00'),
- (13, '20:00'),
- )
- time_id = models.IntegerField(choices=time_choices) # 存数字,choices参数
- class Meta:
- unique_together = ( # 三个联合唯一,防止有人重复预定
- ('room', 'date', 'time_id'),
- )
- def __str__(self):
- return str(self.user) + "预定了" + str(self.room)
注意:
(1)Django中提供了AbstractUser类,可以用来自由定制需要的model
- from django.contrib.auth.models import AbstractUser
-
- class UserInfo(AbstractUser):
- """用户信息表"""
- tel = models.CharField(max_length=32)
如上所示,即可在Django的基础上添加我们所需要的信息。
(2)设置model的时候,设置三个字段联合唯一
- class Book(models.Model):
- """会议室预订信息"""
- ....
- class Meta:
- unique_together = ( # 三个联合唯一,防止有人重复预定
- ('room', 'date', 'time_id'),
- )
存的是key 显示的是value,且只能存key。
2、修改配置文件settings.py,覆盖默认的User模型
Django允许你通过修改setting.py文件中的 AUTH_USER_MODEL 设置覆盖默认的User模型,其值引用一个自定义的模型。
AUTH_USER_MODEL = "app01.UserInfo"
上面的值表示Django应用的名称(必须位于INSTALLLED_APPS中)和你想使用的User模型的名称。
注意:在创建任何迁移或者第一次运行 manager.py migrate 前设置 AUTH_USER_MODEL。
设置AUTH_USER_MODEL数据库结构有很大的影响。改变了一些会使用到的表格,并且会影响到一些外键和多对多关系的构造。在你有表格被创建后更改此设置是不被 makemigrations 支持的,并且会导致你需要手动修改数据库结构,从旧用户表中导出数据,可能重新应用一些迁移。
3、数据迁移及创建超级用户
- $ python3 manage.py makemigrations
- $ python3 manage.py migrate
这里遇到了一个问题:创建项目时没有创建应用,手动通过manage.py startapp user创建子项目,修改AUTH_USER_MODEL后执行makemigrations一直报错,找不到app01。
创建两个超级用户:
MacBook-Pro:MRBS hqs$ python3 manage.py createsuperuser Username: yuan Password:yuan1234 MacBook-Pro:MRBS hqs$ python3 manage.py createsuperuser Username: alex Password:alex1234
三、系统登录login
urls.py:
- from django.contrib import admin
- from django.urls import path
- from app01 import views
-
- urlpatterns = [
- path('admin/', admin.site.urls),
- path('login/', views.login),
- path('index/', views.index),
- path('book/', views.book),
- ]
简单login.html:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- </head>
- <body>
- <form action="" method="post">
- 用户名:<input type="text" name="user">
- 密码:<input type="password" name="pwd">
- <input type="submit">
- </form>
- </body>
- </html>
login视图函数:
- from django.shortcuts import render, redirect
- # Create your views here.
- from django.contrib import auth
-
- def login(request):
- if request.method == "POST":
- user = request.POST.get("user")
- pwd = request.POST.get("pwd")
-
- user = auth.authenticate(username=user, password=pwd)
- if user:
- # 登录成功
- auth.login(request, user) # 注册request.user,可以拿到登录用户对象所有信息
- redirect("/index/")
-
- return render(request, "login.html")
注意:auth模块的authenticate()方法,提供了用户认证,如果认证信息有效,会返回一个 User 对象;如果认证失败,则返回None。
四、index部分
1、引入admin组件(后台数据管理组件)并完成admin注册
admin.py:
- from django.contrib import admin
- # Register your models here.
- from app01.models import *
-
- admin.site.register(UserInfo)
- admin.site.register(Book)
- admin.site.register(Room)
2、在数据库添加数据
3、index视图函数数据处理和index.html模板渲染
def index(request): # 取当前日期 date = datetime.datetime.now().date() print(date) # 2018-08-17 # 取预约日期,没有指定取当前日期 book_date = request.GET.get("book_date", date) print(book_date) # 2018-08-17 # 拿到预定表中的时段 time_choices = Book.time_choices # 拿到所有的会议室 room_list = Room.objects.all() # 拿到预定信息 book_list = Book.objects.filter(date=boo