Django 版本:1.11
有时候会有一些表单验证,原则上前端会对字段做一些基本的判断,但是后端也应该实现这些验证,因为不能指望别人去帮你完成事情。
Django 有基于表单验证的模型。
在 app 目录下新建 forms.py
,添加:
from django import forms
# 例子
class Login(forms.Form):
username = forms.CharField(required=True)
password = formas.CharField(required=True)
# 注意这里的 `username`,`password`字段必须和前端页面保持一致
# require 这里是必填的意思,还可以设置 min_length,max_length 等。
之后就可以在 views.py
中新建这个对象来验证输入是否合法:
from forms import Login
class LoginView(View):
def post(self, request):
# 创建 login 的实例
login_form = Login(request.POST)
if login_form.is_valid():
pass
当然这个模型一定程度上方便了我们对于表单输入的验证,然而有时会存在这样一种问题:forms 中的字段与当初在 models.py
中定义的字段高度一致,那么很大程度上我们就重用了代码。其实 Django 还提供了一种更方便的模型,是 ModelForm,在 forms.py
中添加:
from django import forms
from xxx import User
class login(forms.ModelForm):
class Meta:
# 这里定义了使用哪个 model
model = User
# 验证哪些字段
fields = ['name', 'password']
另外如果需要对某些字段进行额外的验证,则需要实现 clean_<field> 方法。
def clean_password(self):
pass
if xxx:
pass
else:
# 如果验证不通过,抛出异常
raise forms.ValidationError(u'密码xxx', code='pass_invalid')
from 还能自动将保存到数据库中。例如在 views 中 可以这样写:
login_form = LoginForm(request.POST)
if login_form.is_valid():
# 注意 commit 参数,表示将数据提交到数据库中
user = login_form.save(commit=True)
但是当有些是 choices
字段时,需要在 form
中去数据库中取:
def __init__(self, *args, **kwargs):
super(MyForm,self).__init__(*args, **kwargs)
# self.fields['user'].choices = ((1, '上海'), (2, '北京'),)
# 或
self.fields['user'].choices = models.Classes.objects.all().values_list('id','name')
还有一种方法:
from django.forms import models
# 多选
authors = models.ModelMultipleChoiceField(queryset=models.xxx.objects.all())
# 单选
authors = models.ModelChoiceField(queryset=models.xxx.objects.all())