Django в поисковой форме не возникает ошибка проверки - PullRequest
0 голосов
/ 23 января 2020

Я новичок в программировании (только начал изучать Django & Python). У меня проблемы с проверкой формы, используемой для поиска в БД. Форма должна проверяться, если первое поле пусто или второе и третье поля пусты. В этот момент поведение довольно странное. Если я удаляю форму проверки, все работает как ожидалось с точки зрения функциональности поиска. С этим на месте, как показано ниже, НИКАКОЙ проверки не производится, НО странные вещи начинают происходить:

Если я ввожу действительные данные для 1-го поля или (поле 2 и поле 3) -> возвращаются действительные данные (ожидаемые)

Если я оставляю поля пустыми и нажимаю кнопку поиска, возвращаются все данные БД (не ожидается)

Если я ввожу неправильные данные только для поля 2 или 3, возвращаются все данные БД (не ожидается)

Если я введу неправильные данные для поля 1 или поля 2 и поля 3, ничего не вернется (ожидается)

Полностью признателен за любую помощь?

#forms.py:

class SearchForm(forms.ModelForm):  
    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)


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


        if not cnp_nbr and not first_name and not last_name :
            raise forms.ValidationError(" enter f1 or f2&f3")

        if not first_name and last_name or first_name  and not last_name :
            raise forms.ValidationError("enter f2&f3 ")

        return all_clean_data

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


#Views.py

class ClientsSearch(generic.FormView):
    form_class = forms.SearchForm
    model = models.Clients
    template_name = "administration/clients_search.html"

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

    def get_queryset(self): 
        form = forms.SearchForm(self.request.GET)
        if form.is_valid():
                return self.model.objects.filter(
            Q(cnp_nbr__exact=form.cleaned_data['cnp_nbr']) |Q(first_name__exact=form.cleaned_data['first_name']) & Q(last_name__exact=form.cleaned_data['last_name'])
        )

        return models.Clients.objects.all()


#HTML:

 <form method="GET"  action="{% url 'administration:searchresults' %}"  >
    {% csrf_token %}
    {{ form.as_p }}
    <button id="submit" name = "submit" type="submit">Search</button>
  </form>

1 Ответ

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

Если я правильно понял ваши требования, ваш clean метод должен выглядеть следующим образом:

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

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

    return all_clean_data
...