Skip to main content
 首页 » 编程设计

python之Django 表单字段验证失败

2025年05月04日35落叶

这是我的表格。

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 方法。 BUt 都未能显示验证错误。

这是我的 View

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 %} 

请您参考如下方法:

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

但请注意,您应该从表单的 cleaned_data 字典中获取填充 filtered_dict 的值,而不是直接从 request.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 :(')