【问题标题】:Stuck with django form validation坚持使用 django 表单验证
【发布时间】:2019-04-27 10:42:19
【问题描述】:

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

form.html

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

list.html

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

forms.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

views.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 参数中看到“area”甚至没有转换为大写(“2E”而不是“2e”)。

【问题讨论】:

    标签: python django


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,我没有读到验证不适用于 GET 的任何地方。但是,除了 '.html',django 不会让我 POST 到 ListView...
    • 我在stackoverflow.com/questions/6406553/…找到了一个可能的解决方案
    • 我不明白。您需要发布到 FormView,而不是 ListView。
    猜你喜欢
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多