需求:用户注册,用户信息,用户组,用户组和用户信息为1对多
models.py模块信息
UserGroup 用户组
ID | name |
1 | 超级管理员 |
2 | 普通用户 |
反向取值:
obj = UserGroup.objects.filter(id = 1).first()
obj.UserInfo_set # 反向查找所有 id =1 的用户
class UserGroup(models.Model): #用户组表
name=models.CharField(max_length=30)
UserInfo 用户信息
ID | username | password | creat_date | type_id |
1 | lee | 123456 | 2016-12-20 | 1 |
models : 定义的字段 为 type ,但是Django 会在生成的表中,把 type字段 后面添加 _id
当前表中 :注意当前表查询的时候,外键只有1个下划线
取值的时候 filter( xx.type = UserGroup 对象) 返回 1个 UserGroup 对象
filter(xxx.type_id =1) 返回 正常数字1
class UserInfo(models.Model): #用户信息
username=models.CharField(max_length=30)
creat_date=models.DateTimeField(auto_now_add=True) #时间设置自增
password=models.CharField(max_length=30)
type=models.ForeignKey('UserGroup') #外键
模版获取UserInfo 表信息
data=UserInfo.objects.all()
for item in data
item.username=》 'lee'
item.password=》'123456'
item.type.name=》'超级管理员' # 实例对象(data).用户组(type).用户组详细信息(name)
跨表查询信息(外键) 两下划线
如查询 UserGroup 表中所有 id=1(超级管理员)的信息
data=UserInfo.objects.filter(type__id=1)
注意:这里的type 为1个 UserGroup 对象
外键跨表正向取值 用点 data.type.name
外键跨表正向查询 (filter)用两下划线 filter( type__id)
同理 values ,value_list ,也用两下划线 __ 查询
data=UserInfo.objects.filter(type__id=1).values(type__id ,type__name)
data=UserInfo.objects.filter(type__id=1).value_list(type__id ,type__name)
values,value_list 点击查询models 增删改查
template 模版模块 register
<form action='' method='POST'>
<p>用户名:<input name='username'></input></p>
<p>密 码:<input name='password'></input></p>
<p>
<select name='group'>
<option value="0">--请选择---</option>
{% for item in ugs%}
<option value="{{item.id}}">{{item.type}}</option>
{% endfor %}
</select>
</p>
<input type='submit' value='注册'>
<div style="color:red ">{{error.status}}</div>
</form>
注意:获取select 选项卡时 ,获取的值为 group:0 假如当前选择的为第0个选项卡
详细解释如下图所示:
views.py 模块
逻辑控制:
- 用户名密码是否为空
- 是否选择用户组
- 条件满足时,返回生成的视图函数
from django.shortcuts import render,redirect
from system.models import UserInfo, UserGroup
def register(request): #用户注册
ret={'status':''} #错误状态
ugs = UserGroup.objects.all() #每次打开register.html ,获取用户组信息
if request.method=='GET': #当HTTP请求为GET
return render(request,'register.html',{"ugs":ugs}) #register.html 生成用户信息
if request.method=='POST': #当HTTP请求为POST
username=request.POST.get('username') #获取输入框中的username,password 和type(外键表)
password=request.POST.get('password')
ugid = request.POST.get('group', "0") #获取当前的用户组类型 type 如上图所示
is_empty=all([username,password]) #判断用户名密码是否为空
if is_empty: #如果不为空
if ugid == "0": #判断用户组是否为默认值,即没选择用户组
ret['status']='请选择用户组' #显示错误状态
return render(request,'register.html',{"ugs":ugs,"error":ret})
ug = UserGroup.objects.get(id=ugid) #用户名密码不为空时,获取当前用户组(id)
user = UserInfo() #生成用户信息
user.username = username
user.password = password
user.typeid = ug #生成当前用户
user.save()
return redirect("/system/index") #跳转到 首页
else:
ret['status']='用户名密码不能为空' #如果为空,
return render(request,'register.html',{"ugs":ugs,"error":ret})