第八章表单与模型
django表单功能由Form类实现,主要分为两种
1.django.forms.Form
2.django.forms.ModelForm # 结合模型生成的数据表单
表单form标签中的action用于设置用户提交的表单数据应由哪个路由来接收和处理,若为空,则提交由当前的路由来接收和处理。否则则跳转到属性action所指向的路由地址
提交请求由method决定
网页表单的构成
{% if v.errors %} <!--v为表单类的实例化-->
<p>
数据出错啦,错误信息:{{ v.errors }}
</p>
{% else %}
<form action="" method="post">
{% csrf_token %}
<table>
<!--将表单对象生成网页表单-->
{{ v.as_table }} as_table <!--表单的表示纯用模板变量么-->
</table>
<input type="submit" value="提交">
</form>
{% endif %}
定义表单类,新建表单文件
from django import forms
from .models import *
class VocationForm(forms.Form):
job = forms.CharField(max_length=20, label=\'职位\')
title = forms.CharField(max_length=20, label=\'职称\')
payment = forms.IntegerField(label=\'薪资\') # 难道IntegerField设置数字成可自增自减
# 设置下拉框的值
# 查询模型PersonInfo的数据
value = PersonInfo.objects.values(\'name\') # 获取模型字段中的姓名
# 将数据以为列表格式表示,列表元素为元组格式
choices = [(i+1, v[\'name\']) for i, v in enumerate(value)] # 这里又为什么只显示v[\'name\']
# 表单字段设为ChoiceField类型,用生成下拉框
person = forms.ChoiceField(choices=choices, label=\'姓名\') # choices=choices下拉框
表单类中定义的字段和html标签的比较
字段label转化为label标签, forms.CharField转化为input type="text",job的命名转换为<input>控件的参数name,表单字段的max_length变为input控件的maxlength参数
# 表单类VocationForm的表单字段job
job = forms.CharField(max_length=20, label=\'职位\')
# html标签
<tr><th><label for="id_job">职位:</label></th><td><input type="text" name="job" maxlength="20" required id="id_job"></td></tr>
form源码分析
位置:django/forms/forms.py
表单的定义过程、表单的字段类型和表单字段的参数类型是表单的核心功能。
8.4视图里使用form
属性
prefix
prefix的作用就是为form命名,以区分多个表单,当然它实例化出来的html标签属性值是带有该参数
# 您可以将多个 Django 表单放在一个<form>标签中。要给每个 Form自己的命名空间,请使用关键字参数:prefix
initial是表单实例化的初始化数据,他只适用于模型数据传递给表单,再由表单显示在网页上
post请求从表单中获取数据然后保存起来到数据库中,get请求是在url链接上的id获取,然后再模型中找到相应的数据,把数据库中的数据写到表单上
无论是统计字符串还是列表
xx.count(传入统计的参数)
filter查询字段为0的情况下,就无法使用update,需要使用get_or_create(d),除主键外,只要有一个数据不同就插入
create(d),直接插入
8.5
表单类Form和模型实现数据交互最主要的问题是表单字段和模型字段的匹配性,如果将表单类Form改为ModelForm,就无需考虑字段匹配性的问题。
最好使用模型表单,表单类提取数据保存太难受了,我的报错问题:
ValueError: invalid literal for int() with base 10: \'\'
# commit=False就会生成一个数据库对象,然后可以对该数据库对象进行增删改除,然后将修改的数据保存到数据库中。
# commit=True则直接将表单数据保存到数据库中
8.4,8.5表单的数据提取判断等逻辑都值得好好推敲
分割线
表单forms的属性和方法的源文件
在
django/forms/forms.py
主要类class BaseForm: (类中)
属性调用不加(),函数调用加()
表单字段类型和模型字段类型类似
源码位置django/forms/fields.py
模型表单的源码
djano/forms/models.py
主要类
class BaseModelForm:中
表单类ModelForm于模型之间没有直接的数据交互,模型表单与模型之间的数据交互是由函数modelform_factory实现的,该函数将自定义的模型表单与模型进行绑定,从而实现两者之间的数据交互。
函数modelform_factory与类ModelForm定义在同一个源码文件中,它定义了9个属性
model, form=ModelForm, fields=None, exclude=None,
formfield_callback=None, widgets=None, localized_fields=None,
labels=None, help_texts=None, error_messages=None,
field_classes=None
模型字段与表单字段的转换规则
视图里使用form
实现表单数据与模型交互
待补充的两个小结