【问题标题】:Adding custom validation to a field, for the generic view CreateView为通用视图 CreateView 添加自定义验证到字段
【发布时间】:2023-03-11 13:19:02
【问题描述】:

问题

在 Django 1.3 中为表单字段添加自定义验证,表单由通用视图 CreateView 创建。

型号

class Picture(models.Model):
    file = models.ImageField(upload_to=get_image_path)
    filename = models.CharField(max_length=50, blank=True)
    user = models.ForeignKey(User, editable=False)
    upload_date = models.DateTimeField(auto_now_add=True,editable=False)

通用视图 CreateView,稍作修改

class PictureCreateView(CreateView):
    model = Picture

    def clean_file(self,form):
        if image:
            if image._size > settings.MAX_IMAGE_SIZE:
                raise ValidationError("Image file too large ( > 20mb )")
        else:
             raise ValidationError("Couldn't read uploaded image")

    def get_form(self, form_class):
        form = super(PictureCreateView, self).get_form(form_class)
        form.instance.user = self.request.user
        return form

    def form_invalid(self, form):
        ...omitted none important code...
        response = JSONResponse(data, {}, response_mimetype(self.request))
        response['Content-Disposition'] = 'inline; filename=files.json'
        return response

    # Called when we're sure all fields in the form are valid
    def form_valid(self, form):
        ...omitted none important code...
        response = JSONResponse(data, {}, response_mimetype(self.request))
        response['Content-Disposition'] = 'inline; filename=files.json'
        return response

我的问题是:如何在达到 form_valid() 之前对文件字段进行自定义验证?

简而言之,我到目前为止所做的事情

根据此处的文档 - https://docs.djangoproject.com/en/dev/ref/forms/validation/ 我应该能够覆盖文件字段表单验证器,我正在尝试使用 clean_file() “表单子类中的 clean_() 方法 - 替换为表单字段属性的名称。” 如果我手动创建表单,这会很容易,但它是由 Django 从模型通过通用视图创建的。

我目前的解决方案,这是一个丑陋的 hack: 你可以看到我已经覆盖了 form_valid() 和 form_invalid(),在 form_valid() 中我现在调用 clean_file() 如果这是一个错误,我会调用 form_invalid()。这会产生一些问题,例如我需要手动创建错误消息响应。

【问题讨论】:

    标签: python django django-models django-forms django-views


    【解决方案1】:

    为什么不create your modelform

    from django import forms
    
    class PictureForm(forms.ModelForm):
        def clean_file(self,form):
            if image:
                if image._size > settings.MAX_IMAGE_SIZE:
                    raise ValidationError("Image file too large ( > 20mb )")
            else:
                raise ValidationError("Couldn't read uploaded image")
    
        class Meta:
            model = Picture
    

    然后你可以在你的视图中使用它the form_class attribute:

    class PictureCreateView(CreateView):
        form_class = PictureForm
    
        # .... snip
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-17
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      • 2011-11-23
      • 2019-02-22
      相关资源
      最近更新 更多