首页 > 解决方案 > 坚持使用 django 表单验证

问题描述

我正在尝试在用于检索 ListView 视图中的对象列表的 django 表单上运行验证。尽管在这里阅读了 django 文档和许多其他问题,但我无法在这个简单的测试代码中找出问题所在:

表单.html

<form action="list.html" method="get">
    {{ form }}
    <input type="submit" value="Submit">
</form>

列表.html

<ul>
    {% for area in object_list %}
        <li>{{ area.name }}</li>
    {% endfor %}
</ul>

表格.py

from django import forms

class SearchArea(forms.Form):
    area = forms.CharField(label='Area code', max_length=6)

    def clean_area(self):
        area = self.cleaned_data['area'].upper()
        if '2' in area:
            raise forms.ValidationError("Error!")
        return area

视图.py

class HomePageView(FormView):
    template_name = 'form.html'
    form_class = SearchArea

class AreaListView(ListView):
    template_name = 'list.html'
    model = AreaCentral

    def get_queryset(self):
        q = self.request.GET.get('area')
        return AreaCentral.objects.filter(area__istartswith=q)

当我尝试提交“2e”之类的内容时,我预计会出现验证错误,而是提交了表单。此外,我可以在 GET 参数中看到“区域”甚至没有转换为大写字母(“2E”而不是“2e”)。

标签: pythondjango

解决方案


默认的 FormView 只会在 POST 上处理表单;GET 用于最初显示空表单。所以你需要method="post"在你的模板表单元素中使用。

您的action属性也值得怀疑;它需要指向表单视图的 URL。如果这实际上是 URL,请注意在 Django URL 中使用“.html”之类的扩展名是不常见的,我建议不要这样做。


推荐阅读