Python Django表单字段验证失败

Python Django表单字段验证失败,python,django,Python,Django,这是我的表格 class POICreateForm(ModelForm): def __init__(self, *args, **kwargs): super(POICreateForm, self).__init__(*args, **kwargs) self.fields['latitude'].widget = HiddenInput() self.fields['longitude'].widget = HiddenInput(

这是我的表格

class POICreateForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(POICreateForm, self).__init__(*args, **kwargs)
        self.fields['latitude'].widget = HiddenInput()
        self.fields['longitude'].widget = HiddenInput()
        self.fields['picture'].required = True

    class Meta:
        fields = ['name', 'vip', 'category', 'place', 'latitude', 'longitude', 'picture', 'website', 'description',
                  'phone',
                  'email']
        model = PointOfInterest

    def clean(self):
        cleaned_data = super(POICreateForm, self).clean()
        pic = cleaned_data.get('picture', None)
        if not pic:
            msg = 'You must Choose an image'
            self.add_error('picture', msg)

        return cleaned_data
我已经为
picture
字段指定了
required=True
,并且覆盖了
clean
方法。但两者都未能显示验证错误

这是我的
视图

class POIFormCreateView(LoginRequiredMixin, CreateView):
    login_url = '/login/'
    model = PointOfInterest
    form_class = POICreateForm
    success_url = reverse_lazy('POIs')

    def post(self, request, *args, **kwargs):

        query_dict = request.POST.dict()
        super(POIFormCreateView, self).post(request, *args, **kwargs)
        filtered_dict = {i: j for i, j in query_dict.items() if i.endswith('day')}

        out = PointOfInterestQuery.create_or_update_open_hours(filtered_dict)
        if out:
            return HttpResponseRedirect(reverse('POIs'))
        return HttpResponse('Error :(')
template.html

{% extends 'base.html' %}
{% load crispy_forms_tags %}

{% block content %}
    <script type="text/javascript">

    </script>
    <h1>New Point Of Interest</h1>

    <form role="form" method="POST" action="/poi/add/" class="post-form form-horizontal"
          enctype="multipart/form-data" name="poi_create" onsubmit="return validateForm()">{% csrf_token %}
        <div class="container row">
            <div class="col-lg-6">
                <!-- customizing form -->
                {{ form|crispy }}
                <!-- End of customization -->
            </div>
            <div class="col-lg-6">
                <div id="map"></div>
                {% include 'open_hours.html' %}
            </div>
        </div>
                    <button type="submit" id="poi-submit" class="save btn btn-default btn-primary center-block">Save
                </button>
    </form>
    <div class="modal-footer"><a href="/poi/">
        <button type="button" class="btn btn-default btn-danger center-block">Cancel
        </button>
    </a></div>

{% endblock %}
{%extends'base.html%}
{%load crispy_forms_tags%}
{%block content%}
新的兴趣点
{%csrf_令牌%}
{{form | crispy}}
{%include'open_hours.html%}
拯救
{%endblock%}

您已经覆盖了
post
方法,并且完全避免使用表单。所有这些逻辑都应该使用
form\u valid
方法;这允许CreateView执行表单验证的正常工作,并在表单无效时重新显示有错误的页面,而在表单有效时进行处理

但也请注意,您应该从表单的
已清理的\u数据
dict中获取值以填充
已筛选的\u dict
,而不是直接从
请求。POST

class POIFormCreateView(LoginRequiredMixin, CreateView):
    login_url = '/login/'
    model = PointOfInterest
    form_class = POICreateForm
    success_url = reverse_lazy('POIs')

    def form_valid(self,form):
        super(POIFormCreateView, self).form_valid(form)
        filtered_dict = {i: j for i, j in self.request.POST.items() if i.endswith('day')}

        out = PointOfInterestQuery.create_or_update_open_hours(filtered_dict)
        if out:
            return HttpResponseRedirect(reverse('POIs'))
        return HttpResponse('Error :(')

请显示您的视图和模板。@DanielRoseman已完成…我知道如何通过前端进行验证。但我想让django做那份工作。我还试着在
clean
函数中打印
clean\u数据。它会吐出所有给定的表单数据,除了
图片
,因为我不会给出这些数据。但是django没有显示error.ya,我重写了post方法,但是
super(POIFormCreateView,self)。post(request,*args,**kwargs)
应该调用基类的
post
方法。是吗?是的,但是您没有对结果做任何操作,因此Django无法显示错误。基本上,重写
post
是不正确的,在这种情况下肯定不正确。如果我在
super
调用之前添加
return
,那么接下来的代码将不会执行。我希望在超级调用之后执行该代码,因为
super
创建了一个模型对象,然后下面的代码将
value
添加到新创建的对象中。有什么办法可以做到这一点吗?如果你不听我的劝告,我帮不了你。该代码属于form\u valid,而不是post。你的意思是,
form=POICreateForm(request.post);form.is_valid():pass
。一点代码应该对我有很大帮助。