第八章:Django开发中表单认识

一、说明Django中的表单与HTML中的表单不是一个东西

二、Django中的表单是对HTML中表单提交过来的数据进一步的校正,使用步骤

  • 1、在组件(App)目录下创建一个forms.py的文件
  • 2、在文件中创建表单相关的类(下面错误error_messages提示是自己定义的)

    注意在forms.py里面定义的变量要与form表单中的name一致

    from django import forms
    
    
    class RegisterForms(forms.Form):
        username = forms.CharField(required=True, max_length=10, min_length=3,error_messages={'required': u'必填字段', 'max_length': u'长度超过10位', 'min_length': u'长度太短'})
        password = forms.CharField(required=True, error_messages={'required': u'必填字段'})
  • 3、使用创建的RegisterForms

    def register(request):
        if request.method == "GET":
            return render(request, 'register.html')
        else:
            form = RegisterForms(request.POST)
            # 通过forms验证数据的合法性
            if form.is_valid():
                return HttpResponse(u'注册成功')
            else:
                return HttpResponse(u'注册失败')
  • 4、把错误返回到前端页面(利用form.errors)

    def register(request):
        if request.method == "GET":
            return render(request, 'register.html')
        else:
            form = RegisterForms(request.POST)
            # 通过forms验证数据的合法性
            if form.is_valid():
                return HttpResponse(u'注册成功')
            else:
                return render(request, 'register.html', {'errors': form.errors})
  • 5、把错误状态以json格式返回到前端页面

    return render(request, 'register.html', {'errors': form.errors.as_json()})
  • 6、使用cleaned_data拿取数据保存到数据库

    cleaned_data这个是在is_valid()返回true的时候,可以通过get获取到干净的数据

     def register(request):
        if request.method == "GET":
            return render(request, 'register.html')
        elif request.method == "POST":
            form = RegisterForms(request.POST)
            # 通过forms验证数据的合法性
            if form.is_valid():
                # 验证合法性后从cleaned_data.get()获取输入的值
                username = form.cleaned_data.get('username', None)
                password = form.cleaned_data.get('password', None)
                userModel = UserModel(username=username, password=password)
                userModel.save()
                return HttpResponse(u'注册成功')
            else:
                return render(request, 'register.html', {'errors': form.errors.as_json()})
        else:
            return HttpResponse(u'不被处理的请求')

三、表单中常见的Field(有点类似Models.py里面一样)

  • 1、CharField表示一个字符的,可以传递required,max_length,min_length参数
  • 2、BooleanField一般用户复选框的,传入参数required=False因为不是必选的
  • 3、DateField用来验证输入时间
  • 4、EmailField用户输入邮箱
  • 5、FloatField用来验证是否为浮点型
  • 6、IntegerField用来验证是否为整数
  • 7、URLField用来验证URL
  • 8、FileField用来验证是否为文件,传入max_length表示文件名长度
  • 9、ImageField验证是否为图片,需要先按照pillow

四、上传文件的步骤

  • 1、在数据库定义一个字段

    
    # 新增头像的
    
    avatar = models.CharField(max_length=100, null=True)
  • 2、在forms.py里面定义一个字段验证

    
    # 注意这个地方要加上upload_to='',这样文件才可以上传到指定目录下
    
    avatar = forms.FileField(max_length=100,upload_to='',)
  • 3、生成数据库文件

  • 4、在项目的根目录下创建一个用来上传图片的文件夹
  • 5、在settings.py中配置指定到该目录下

    
    # 配置文件上传存放路径 
    
    MEDIA_ROOT = 'files'
  • 6、在form表单中设置enctype="multipart/form-data"

  • 7、在view中使用form = RegisterForms(request.POST, request.FILES)接收上传文件
  • 8、将文件名保存到数据库

五、自定义表单验证器

  • 1、在表单中,重写一个方法clean_fieldname,如果出现错误旧抛出ValidationError错误
  • 2、判断没问题要返回去

    class RegisterForms(forms.Form):
        ...
        password = forms.CharField(required=True, error_messages={'required': u'必填字段'})
        avatar = forms.FileField(max_length=100)
    
        # 自定义验证器
        def clean_password(self):
            password = self.cleaned_data.get('password', None)
            if len(password) < 3:
                raise forms.ValidationError(u'密码长度过短', code='min_length')
            return password
  • 3、全局验证,多个字段一起验证(常见密码验证)

    
    # 定义全局的验证 
    
    def clean(self):
        super(RegisterForms,self).clean()
        cleaned_data = self.cleaned_data
        password = cleaned_data.get('password', None)
        password_rep = cleaned_data.get('password_rep', None)
        if password != password_rep:
            raise forms.ValidationError(u'两次密码不一致',code='equal')
        return cleaned_data
  • 4、如果在字段中添加错误

    ...
    if password != password_rep:
        # raise forms.ValidationError(u'两次密码不一致',code='equal')
        self.add_error('password', '密码不一致')
    return cleaned_data
    ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水痕01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值