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

来源:互联网 发布:中国国产狙击步枪 知乎 编辑:程序博客网 时间:2024/05/19 14:02

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

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

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

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

    from django import formsclass 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...
原创粉丝点击