一. 在user_list.htmlw文件中添加(改进添加用户)a超链接
<div style="margin-bottom: 10px">
<a class="btn btn-success" href="/user/add/">
<span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span>
新建用户
</a>
<a class="btn btn-success" href="/user/model/form/add/">
<span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span>
ModelForm新建用户
</a>
</div>
二 .在urls.py文件添加URL和视图函数对应关系
# 用户系列
path('user/list/', views.user_list),
# path('user/add/', views.user_add),
path('user/model/form/add/', views.user_model_form_add), # 改进添加用户
]
三. 在views.py文件写视图函数
from django import forms
# 1.写一个类
class UserModelForm(forms.ModelForm):
name = forms.CharField(min_length=2, label="用户名") # 验证规定用户名输入字符串最小为2
class Meta:
model = models.UserInfo # 重新定义字段
fields = ["name", "password", "age", 'account', 'create_time', "gender", "depart"] # 字段列表
# widgets = { # 给每个字段添加样式,笨办法
# "name": forms.TextInput(attrs={"class": "form-control"}),
# "password": forms.PasswordInput(attrs={"class": "form-control"}),
# "age": forms.TextInput(attrs={"class": "form-control"}),
# }
def __init__(self, *args, **kwargs): # 重新定义类的初始属性
super().__init__(*args, **kwargs) # 只要重新执行就继承父类的初始属性
# 循环找到所有的插件,添加了class="form-control"
for name, field in self.fields.items(): # 循环找到所有的name 字段名和field=对象
# if name == "password": # 不想让x字段不加样式
# continue # 绕过去
# 对象.插件 = (每个对象添加上样式)
field.widget.attrs = {"class": "form-control", "placeholder": field.label}
# 2 写函数
def user_model_form_add(request):
""" 添加用户(ModelForm版本)"""
if request.method == "GET": # 如果GET方式提交
form = UserModelForm()
return render(request, 'user_model_form_add.html', {"form": form})
# 用户POST提交数据,数据校验。
form = UserModelForm(data=request.POST) # 把POST提交数据传给UserModelForm就拿到数据
if form.is_valid(): # 如果校验成功
# 如果数据合法,保存到数据库(下面是拿到的数据)
# {'name': '123', 'password': '123', 'age': 11, 'account': Decimal('0'), 'create_time': datetime.datetime(2011, 11, 11, 0, 0, tzinfo=<UTC>),
# 'gender': 1, 'depart': <Department: IT运维部门>}
# print(form.cleaned_data)
# models.UserInfo.objects.create(..)
form.save() # 自动保存的数据库
return redirect('/user/list/') # 返回页面
# 校验失败(在页面上显示错误信息) 在settings.py文件下找到LANGUAGE_CODE = 改为:LANGUAGE_CODE = 'zh-hans' 就显示 中文
return render(request, 'user_model_form_add.html', {"form": form})
四. templates里写HTML文件
{% extends 'layout.html' %} <!--继承layout.html模板 -->
{% block content %}
<div class="container">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title"> 新建用户 </h3>
</div>
<div class="panel-body">
<form method="post" novalidate> <!--novalidate=关闭浏览器做的校验 -->
{% csrf_token %} <!--模板语法测试表单 -->
{% for field in form %} <!--循环取出字段 -->
<div class="form-group"> <!--样式 -->
<label>{{ field.label }}</label> <!--取出每个字段的中文 -->
{{ field }} <!--字段 -->
<span style="color: red;">{{ field.errors.0 }}</span> <!--有错误信息就以红色显示出来 -->
</div>
{% endfor %} <!-- 循环法结束 -->
<button type="submit" class="btn btn-primary">提 交</button>
</form>
</div>
</div>
</div>
{% endblock %}
五. 输入错误时显示中文提示
在settings文件里添加:
# LANGUAGE_CODE = 'en-us' #
LANGUAGE_CODE = 'zh-hans' # 显示中文