Django 表单验证消息未显示

Posted

技术标签:

【中文标题】Django 表单验证消息未显示【英文标题】:Django Forms Validation message not showing 【发布时间】:2018-05-30 05:45:43 【问题描述】:

我正在尝试限制可以在表单中上传的文件类型、大小和扩展名。该功能似乎有效,但未显示验证错误消息。我意识到if file._size > 4*1024*1024 可能不是最好的方法 - 但我稍后会处理。

这是forms.py:

class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = ['name', 'description', 'url', 'product_type', 'price', 'image', 'image_url', 'product_file']
        labels = 
            'name': 'Product Name',
            'url': 'Product URL',
            'product_type': 'Product Type',
            'description': 'Product Description',
            'image': 'Product Image',
            'image_url': 'Product Image URL',
            'price': 'Product Price',
            'product_file': 'Product Zip File',
        
        widgets = 
            'description': Textarea(attrs='rows': 5),
        

    def clean(self):
        file = self.cleaned_data.get('product_file')

        if file:
            if file._size > 4*1024*1024:
                raise ValidationError("Zip file is too large ( > 4mb )")
            if not file.content-type in ["zip"]:
                raise ValidationError("Content-Type is not Zip")
            if not os.path.splitext(file.name)[1] in [".zip"]:
                raise ValidationError("Doesn't have proper extension")

                return file
            else:
                raise ValidationError("Couldn't read uploaded file")

...这是我用于该表单的视图:

def post_product(request):
    # if this is a POST request we need to process the form data
    if request.method == 'POST':
        # create a form instance and populate it with data from the request:
        form = ProductForm(data = request.POST, files = request.FILES)
        # check whether it's valid:
        if form.is_valid():
            # process the data in form.cleaned_data as required
            product = form.save(commit = False)
            product.user = request.user
            product.likes = 0
            product.save()
        # redirect to a new URL:
        return HttpResponseRedirect('/products')

我错过了什么?

【问题讨论】:

【参考方案1】:

在您看来,无论表单是否有效,您都在进行重定向 - 因此 Django 无处显示表单错误。

执行此操作的正常方法是在 is_valid()False 时重新呈现表单:

if form.is_valid():
    # process the data in form.cleaned_data as required
    product.save()
    # redirect to a new URL - only if form is valid!
    return HttpResponseRedirect('/products')
else:
    ctx = "form": form 
    # You may need other context here - use your get view as a template
    # The template should be the same one that you use to render the form
    # in the first place.
    return render(request, "form_template.html", ctx

您可能需要考虑为此使用基于类的FormView,因为它会处理重新呈现有错误的表单的逻辑。这比编写两个单独的 get 和 post 视图来管理表单更简单、更容易。即使您不这样做,拥有一个同时处理表单的 GET 和 POST 的视图也会更容易。

【讨论】:

谢谢 - 所以你是说不要在表单上使用def clean,而是在视图上使用上下文? 没有。你的表单clean() 很好,但你的观点不是。您需要处理 form.is_valid() 以不同方式返回 false 的情况 - 即,您需要在发生这种情况时重新呈现表单,以便显示验证错误。 知道了——谢谢你的线索——我会去解决这个问题的! :) 好的 - 我的错误部分现在正在工作 - 谢谢。我在'InMemoryUploadedFile' object has no attribute 'content' 上遇到“file.content-type”错误。其他两个工作正常。 它应该是content_type,而不是你现在拥有的content-type。 python 变量中不能有破折号。

以上是关于Django 表单验证消息未显示的主要内容,如果未能解决你的问题,请参考以下文章

Django 表单:无法显示验证错误

我的验证错误消息未显示(Javascript)

如何在 Django 中修改 Bootstrap 4 表单验证信息呈现方式?

使用 jQuery 和验证提交表单

表单未验证角度 2 中 [ngClass] 的使用

显示 ModelForms 的 django 表单验证错误