django Form表单验证

一、示例

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": "添加出错"
            })
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值