本文精华总结在# 6.建立表单的标准流程
1.用Form类来新增表单。
- forms.py
from django import forms
class NewEmployee(forms.Form):
name = forms.CharField()
email = forms.EmailField()
message = forms.CharField()
In [2]: from myclass.forms import NewEmployee
In [4]: f = NewEmployee()
In [5]: print(f)
<tr><th><label for="id_name">Name:</label></th><td><input type="text" name="name" required id="id_name"></td></tr>
<tr><th><label for="id_email">Email:</label></th><td><input type="email" name="email" required id="id_email"></td></tr>
<tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" required id="id_message"></td></tr>
2.clean_data
最后,具有有效数据的表单实例有个 cleaned_data 属性,它的值是一个字典,存储着“清理后的”提交数据。
Django 的表单框架不仅验证数据,还会清理数据,把值转换成合适的 Python 类型:
>>> f = ContactForm({
'subject': 'Hello', 'email': '[email protected]',
'message': 'Nice site!'})
>>> f.is_valid() True
>>> f.cleaned_data
{
'message': 'Nice site!', 'email': '[email protected]', 'subject':
'Hello'}
这个联系表单只处理字符串,经“清理”后得到字符串对象。然而,如果使用 IntegerField 或 DateField,表单框架会确保清理后的数据使用正确的 Python 整数或 datetime.date 对象。
- 我遇到的低级错误:clean_data是错误的,cleaned_data是正确的。
In [1]: from myclass.forms import NewEmployee
In [2]: f = NewEmployee()
In [3]: f.is_valid()
Out[3]: False
In [4]: F2 = NewEmployee({
'subject':'Hello','email':'[email protected]','message':'Nice Day'})
In [5]: F2.is_valid()
Out[5]: True
In [6]: F2.clean_data
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-6-79e6a75fb2a6> in <module>
----> 1 F2.clean_data
AttributeError: 'NewEmployee' object has no attribute 'clean_data'
In [13]: F2.cleaned_data
Out[13]: {
'subject': 'Hello', 'email': '[email protected]', 'message': 'Nice Day'}
3. forms表单的数据,如果POST进数据库呢?
- 参考以下代码进行模型建立
def register(request): # 注册视图函数
if request.method == "POST" and request.POST: # 判断请求方式为post并且有内容
register_form = RegisterForm(data=request.POST) # 满足条件则将输入内容传递给form对象
if register_form.is_valid(): # 校验数据为True(会逐个字段校验,如调用clean方法),获取输入的数据
username = register_form.cleaned_data["username"]
password = register_form.cleaned_data["password"]
nickname = register_form.cleaned_data["nickname"]
phone = register_form.cleaned_data["phone"]
email = register_form.cleaned_data["email"]
# 表中添加数据
UserInfo.objects.create(username=username,password=password,nickname=nickname,phone=phone,email=email)
return HttpResponse("%s,%s,%s,%s,%s"%(username,password,nickname,phone,email)) # 数据有效,页面返回输入值
else:
register_form = RegisterForm() # GET请求时,不传入内容,直接实例化一个form表单(就跟直接访问注册地址效果一样)
return render(request, "register.html", locals()) # 访问url,对应视图函数,对应显示前端页面
- 修改views.py代码如下,再运作还是发生错误,原因是修改了models没有python manage.py makemigrations 和 python manage.py migrate。
# 建立表单页
def NewEmployee_form(request):
if request.method == 'POST' and request.POST:
form = NewEmployee(data=request.POST)
if form.is_valid():
subject = form.cleaned_data['subject']
email = form.cleaned_data['email']
message = form.cleaned_data['message']
# 表中添加数据
NewEmployeeModel.objects.create(subject=subject,email=email,message=message)
return HttpResponseRedirect('/admin/')
else:
form = NewEmployee()
else:
form = NewEmployee()
return render(request, 'myclass/NewEmployee_form.html',context={
'form':form})
- python manage.py makemigrations 和 python manage.py migrate
4.复制forms记得去views中把实例化的forms改掉,否则出现的forms还是旧的那个。
- 错误代码如下,请注意form = NewEmployee(data=request.POST)
# 建立表单页for employee
def Employee_form(request):
if request.method == 'POST' and request.POST:
form = NewEmployee(data=request.POST)
if form.is_valid():
eid = form.cleaned_data['subject']
name = form.cleaned_data['email']
dept_code = form.cleaned_data['message']
gender = form.cleaned_data['message']
on_board = form.cleaned_data['message']
Range = form.cleaned_data['message']
# 表中添加数据
Employee.objects.create(eid=eid,name=name,dept_code=dept_code,gender=gender
,on_board=on_board,Range=Range)
return HttpResponseRedirect('/admin/')
else:
form = NewEmployee()
else:
form = NewEmployee()
return render(request, 'myclass/Employee_form.html',context={
'form':form})
- 旧的forms
- 修改代码如下,请注意form = EmployeeForm(data=request.POST)
def Employee_form(request):
if request.method == 'POST' and request.POST:
form = EmployeeForm(data=request.POST)
if form.is_valid():
eid = form.cleaned_data['eid']
name = form.cleaned_data['name']
dept_code = form.cleaned_data['dept_code']
gender = form.cleaned_data['gender']
on_board = form.cleaned_data['on_board']
Range = form.cleaned_data['Range']
# 表中添加数据
Employee.objects.create(eid=eid,name=name,dept_code=dept_code,gender=gender
,on_board=on_board,Range=Range)
return HttpResponseRedirect('/admin/')
else:
form = EmployeeForm()
else:
form = EmployeeForm()
return render(request, 'myclass/Employee_form.html',context={
'form':form})
-
新的forms
-
提交表格后,保存成功
5.Form类可参考django官方文档
https://docs.djangoproject.com/zh-hans/3.1/topics/forms/
https://docs.djangoproject.com/zh-hans/3.1/topics/forms/modelforms/#modelform
6.建立表单的标准流程
- 第一步:建立models.py的模型,形成与forms、views的对应关系。
#models.py
class Employee(models.Model):
eid = models.CharField(max_length=200,default='1')
name = models.CharField(max_length=200,null=True)
dept_code = models.CharField(max_length=200,null=True)
GENDER_CHOICES = (
(u'Male', u'Male'),
(u'Female', u'Female'),
)
gender = models.CharField(max_length=200,choices=GENDER_CHOICES,null=True)
on_board = models.BooleanField(null=True)
Range_CHOICES = (
(u'R1', u'R1'),
(u'R2', u'R2'),
(u'R3', u'R3'),
(u'R4', u'R4'),
)
Range = models.CharField(max_length=200,choices=Range_CHOICES,null=True)
def __str__(self):
return self.name
- 第两步:比照models的属性,建立forms。
#修改forms.py
class EmployeeForm(forms.Form):
eid = forms.CharField()
name = forms.CharField()
dept_code = forms.CharField()
gender = forms.CharField()
on_board = forms.BooleanField()
Range = forms.CharField()
- 第三步:通过views.py来建立models和form的关联。
#views.py
# 建立表单页for employee
def Employee_form(request):
if request.method == 'POST' and request.POST:
form = EmployeeForm(data=request.POST)
if form.is_valid():
eid = form.cleaned_data['eid']
name = form.cleaned_data['name']
dept_code = form.cleaned_data['dept_code']
gender = form.cleaned_data['gender']
on_board = form.cleaned_data['on_board']
Range = form.cleaned_data['Range']
# 表中添加数据
Employee.objects.create(eid=eid,name=name,dept_code=dept_code,gender=gender
,on_board=on_board,Range=Range)
return HttpResponseRedirect('/admin/')
else:
form = EmployeeForm()
else:
form = EmployeeForm()
return render(request, 'myclass/Employee_form.html',context={
'form':form})
- 第四步:修改urls,来映射views。
#myclass/urls.py
urlpatterns = [
path('Employee_form/',views.Employee_form,name='Employee_form'),
]
- 第五步:填写表单,检查数据是否提交至admin。若有错误,则需重新检查第一步到第四步。