Django проверка формы не работает для всех полей - PullRequest
0 голосов
/ 27 января 2020

новичок в полевых условиях и борьба с проверкой формы на практике. Я создал форму, которую я использую в качестве ввода данных для поиска в БД. Проверка формы запускается только для первого поля, в то время как другие, кажется, не принимаются во внимание, ниже код:

Описание формы:


class SearchForm(forms.Form):  
        cnp_nbr = forms.IntegerField(label='CNP', widget=forms.TextInput(attrs={'class': 'form-control' }), required=False)  
        first_name = forms.CharField(label='First Name', widget=forms.TextInput(attrs={'class': 'form-control'}),  required=False) 
        last_name = forms.CharField(label='Last Name', widget=forms.TextInput(attrs={'class': 'form-control'}),  required=False)

        class Meta():
            model = Clients                                
            fields = ('cnp_nbr','first_name','last_name')

        def clean(self):  # most used!!!
            all_clean_data = super().clean()
            cnp_nbr = all_clean_data['cnp_nbr']
            first_name = all_clean_data['first_name']
            last_name = all_clean_data['last_name']

            if  cnp_nbr is None or (first_name is None and last_name is None):
                raise forms.ValidationError("Enter f1 or f2&f3")

            super().clean()

Просмотры:

class ClientsSearch(generic.FormView):
        form_class = forms.SearchForm
        template_name = "administration/clients_search.html"
        success_url = reverse_lazy('administration:searchresults')

        def form_valid(self, form):     
            self.request.session['cnp_nbr'] = form.cleaned_data['cnp_nbr']
            self.request.session['first_name'] = form.cleaned_data['first_name']
            self.request.session['last_name'] = form.cleaned_data['last_name']
            return super().form_valid(form)


class SearchResults (generic.ListView):
        model = models.Clients
        template_name='administration/search_results.html'
        context_object_name = 'all_search_results'

        def get_queryset(self): 
                return self.model.objects.filter(
                Q(cnp_nbr__exact=self.request.session['cnp_nbr']) | Q(first_name__exact=self.request.session['first_name']) & Q(last_name__exact=self.request.session['last_name']) 
            )

HTML для формы поиска:

<form method="POST" >
        {% csrf_token %}
        {{ form.as_p }}
        <button class="btn btn-primary" id="search_submit" name = "search_submit" type="submit" > Search</button>
</form>

Проверка работает только для cnp_nbr, я даже проверял их один за другим. Это работает:

if  cnp_nbr is None:
    raise forms.ValidationError("Enter field")   

Это не

if  first_name is None:
    raise forms.ValidationError("Enter field") 

Поиск работает просто отлично! Заранее спасибо

1 Ответ

0 голосов
/ 27 января 2020

Это потому, что необязательный IntegerField будет None, если он пустой, тогда как необязательный CharField будет '' (пустая строка), если он пустой. Поэтому вам не следует проверять last_name is None, а просто not last_name:

if cnp_nbr is None or not (first_name or last_name):

Примечание: Также я бы посоветовал вам никогда не предполагать, что ключи непосредственно присутствуют в cleaned_data формы: вместо этого выполните Do first_name = all_clean_data.get('first_name').

Примечание 2: Почему бы вам просто не сделать обязательным cnp_nbr, поскольку ваш ValidationError сработает в любом случае, если cnp_nbr не заполнен?

...