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
。一点代码应该对我有很大帮助。