gpt4 book ai didi

python - 向字段添加自定义验证,用于通用 View CreateView

转载 作者:太空狗 更新时间:2023-10-30 02:34:11 25 4
gpt4 key购买 nike

问题

在Django 1.3 中为表单字段添加自定义验证,表单由通用 View 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)

通用 View 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()“表单子(monad)类中的 clean_() 方法 - 其中替换为表单字段属性的名称。”如果我手动创建表单,这会很容易,但它是由 Django 通过通用 View 从模型创建的。

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

最佳答案

为什么不 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

然后您可以在您的 View 中使用 the form_class attribute :

class PictureCreateView(CreateView):
form_class = PictureForm

# .... snip

关于python - 向字段添加自定义验证,用于通用 View CreateView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9749155/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com