一、示例
1.在应用目录下创建forms.py文件
class LoginForm(forms.Form):
username = forms.CharField(required=True, min_length=2)
password = forms.CharField(required=True, min_length=3)
2.在视图views.py中直接导入LoginForm
class Login(View):
def get(self, request, *args, **kwargs):
if request.user.is_authenticated:
return HttpResponseRedirect(reverse("index"))
banners = Banner.objects.all()[:3]
next = request.GET.get("next", "")
login_form = DynamicLoginForm()
return render(request, "login.html", {
"login_form": login_form,
"next": next,
"banners": banners
})
def post(self, request, *args, **kwargs):
# 表单验证
login_form = LoginForm(request.POST)
banners = Banner.objects.all()[:3]
if login_form.is_valid():
# 用于通过用户和密码查询用户是否存在
user_name = login_form.cleaned_data["username"]
password = login_form.cleaned_data["password"]
user = authenticate(username=user_name, password=password)
# 1. 通过用户名查询到用户
# 2. 需要先加密再通过加密之后的密码查询
# user = UserProfile.objects.get(username=user_name, password=password)
if user is not None:
# 查询到用户
login(request, user)
# 登录成功之后应该怎么返回页面
next = request.GET.get("next", "")
if next:
return HttpResponseRedirect(next)
return HttpResponseRedirect(reverse("index"))
else:
# 未查询到用户
return render(request, "login.html", {"msg": "用户名或密码错误", "login_form": login_form, "banners": banners})
else:
return render(request, "login.html", {"login_form": login_form,
"banners": banners})
二、form表单验证
- 当前端提交表单时,要在form表单验证类中添加 request.POST ,如:login_form = LoginForm(request.POST),使用is_valid()方法就会验证表单中提交过来的值,如果表单验证通过返回True,否则返回False。
- 如果要获取表单提交过来的值可以使用form表单的clean_data[’‘字段名’’]
如:login_form.cleaned_data[“username”] - 可在表单中自定义清理函数,格式为:clean_字段名。如:clean_username
class LoginForm(forms.Form):
# Form表单中字段必须跟前端中的name保持一致
username = forms.CharField(required=True, min_length=2)
password = forms.CharField(required=True, min_length=3)
def clean_username(self):
if xxx:
pass
else:
raise forms.ValidationError("自定义错误信息")
return code
三.ModelForm表单验证
# forms.ModelForm:既有form的特性又有model的特性
class AddAskForm(forms.ModelForm):
# 当自己定义的字段就会覆盖Model中的字段
mobile = forms.CharField(max_length=11, min_length=11, required=True)
class Meta:
# 继承的model,从model的属性中映射出form的字段
model = UserAsk
# 指明将Model哪些字段生成form
fields = ["name", "mobile", "course_name"]
class AddAskView(View):
"""
处理用户的咨询
"""
def post(self, request, *args, **kwargs):
userask_form = AddAskForm(request.POST)
if userask_form.is_valid():
# ModelForm具有Model的特性,可以保存数据
# 对提交的数据如果验证无误则进行保存
# commit=True(默认)
userask_form.save(commit=True) # 返回的Model的实例
return JsonResponse({
"status": "success"
})
else:
return JsonResponse({
"status": "fail",
"msg": "添加出错"
})