Я новичок в программировании (только начал изучать 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>