一. form介绍
1.生成页面可用的HTML标签
2. 提供input可以提交数据
3. 对用户提交的数据进行校验
4. 保留上次输入内容
5. 提供错误信息
二. 普通方式书写注册功能
login.html
views.py
三. 使用form组件实现注册功能,自动创建表单
login2.html
views.py
四. form常用的字段和与插件
创建Form类时,主要涉及到 【字段】 和 【插件】,字段用于对用户请求数据的验证,插件用于自动生成HTML;
1. 组件
视图中:
form_obj = RegForm() # 实例化form对象
return render(request, 'reg2.html', {'form_obj': form_obj})
模板中:
form标签加上novalidate 前段不进行校验
{{ form_obj.as_p }} ——》 生成所有的p标签 label input
{{ form_obj.errors }} ——》所有字段的错误
{{ form_obj.user }} ——》 该字段的input框
{{ form_obj.user.label }} ——》 该字段的label 中文提示
{{ form_obj.user.id_for_label }} ——》 该字段的id
{{ form_obj.user.errors }} ——》 该字段的所有的错误信息
{{ form_obj.user.errors.0 }} ——》 该字段的第一个的错误信息
2. 字段
initial: 初始值, input框里面的初始值,默认值
View Codeerror_messages: 重写错误信息
View Codepasswod: 密码
View CoderadioSelect: 单radio值为字符串
View Codeselect
单选select
多选selectcheckbox
单选checkbox
多选checkbox关于choise的注意事项:
在使用选择标签时,需要注意choices的选项可以从数据库中获取,但是由于是静态字段 ***获取的值无法实时更新***,那么需要自定义构造方法从而达到此目的。
方式一
View Code
3. Django Form所有内置字段
View Code
五. 校验
1. 内置校验
View Code2. 自定义校验器
定义函数
View Code
from django.core.exceptions import ValidationError
def check(value):
if 'alex' in value:
raise ValidationError('敏感词汇,不符合社会职业核心价值观')
validators=[check]
3. 局部钩子
定义一个放法 clean_字段名(self,)的方法,如果不通过校验规则,要抛出异常ValidationError,如果通过校验规则,返回通过校验的值
def clean_user(self):
value = self.cleaned_data.get('user')
if 'alex' in value:
raise ValidationError('敏感词汇,不符合社会职业核心价值观')
return value
4. 全局钩子
定义一个放法 clean(self)的方法,如果不通过校验规则,要抛出异常ValidationError,还可以自己使用self.add_error('re_pwd', '两次密码不一致!!@!')添加错误信息。如果通过校验规则,返回所有通过校验的值
ef clean(self):
pwd = self.cleaned_data.get('pwd')
re_pwd = self.cleaned_data.get('re_pwd')
if pwd != re_pwd:
self.add_error('re_pwd', '两次密码不一致!!@!')
raise ValidationError('两次密码不一致')
return self.cleaned_data
ModeForm
通常在Django项目中,我们编写的大部分都是与Django 的模型紧密映射的表单。 举个例子,你也许会有个Book 模型,并且你还想创建一个form表单用来添加和编辑书籍信息到这个模型中。 在这种情况下,在form表单中定义字段将是冗余的,因为我们已经在模型中定义了那些字段。
基于这个原因,Django 提供一个辅助类来让我们可以从Django 的模型创建Form,这就是ModelForm。
modelForm定义
form与model的终极结合。
class BookForm(forms.ModelForm):
class Meta:
model = models.Book
fields = "__all__"
labels = {
"title": "书名",
"price": "价格"
}
widgets = {
"password": forms.widgets.PasswordInput(attrs={"class": "c1"}),
}
class Meta下常用参数:
model = models.Book # 对应的Model中的类 fields = "__all__" # 字段,如果是__all__,就是表示列出所有的字段 exclude = None # 排除的字段 labels = None # 提示信息 help_texts = None # 帮助提示信息 widgets = None # 自定义插件 error_messages = None # 自定义错误信息
ModelForm的验证
与普通的Form表单验证类型类似,ModelForm表单的验证在调用is_valid() 或访问errors 属性时隐式调用。
我们可以像使用Form类一样自定义局部钩子方法和全局钩子方法来实现自定义的校验规则。
如果我们不重写具体字段并设置validators属性的化,ModelForm是按照模型中字段的validators来校验的。
save()方法
每个ModelForm还具有一个save()方法。 这个方法根据表单绑定的数据创建并保存数据库对象。 ModelForm的子类可以接受现有的模型实例作为关键字参数instance;如果提供此功能,则save()将更新该实例。 如果没有提供,save() 将创建模型的一个新实例:
>>> from myapp.models import Book >>> from myapp.forms import BookForm # 根据POST数据创建一个新的form对象 >>> form_obj = BookForm(request.POST) # 创建书籍对象 >>> new_ book = form_obj.save() # 基于一个书籍对象创建form对象 >>> edit_obj = Book.objects.get(id=1) # 使用POST提交的数据更新书籍对象 >>> form_obj = BookForm(request.POST, instance=edit_obj) >>> form_obj.save()
