Почему я не могу фильтровать данные по одному известному признаку в django&

У меня есть нарисованный фильтр в view.py, который замечательно работает. Когда я использую в html-коде общую аббревиатуру, например {{form.as_p}} или {{form|crispy}}, то я могу найти нужные мне данные по одному известному. В моем случае это по курсу, по семестру, по типу предмета, по институту и так далее, и когда я начинаю писать свой html код, то для того чтобы поиск выдал правильный ответ, все поля должны быть заполнены, хотя в формах и моделях я определил, что все поля не обязательны, получается, что ошибка в html коде, но я не знаю где(

).

veiws.py:

def buy_files(request):
bdfiles = FeedFile.objects.all()
# bdfiles = UploadFile.objects.all()
form = FileFilterForm(request.GET)
if form.is_valid():
    if form.cleaned_data["number_course"]:
        bdfiles = bdfiles.filter(feed__number_course = form.cleaned_data["number_course"])
    if form.cleaned_data["number_semestr"]:
        bdfiles = bdfiles.filter(feed__number_semestr = form.cleaned_data["number_semestr"])
    if form.cleaned_data["subjectt"]:
         bdfiles = bdfiles.filter(feed__subjectt = form.cleaned_data["subjectt"])
    if form.cleaned_data["type_materials"]:
         bdfiles = bdfiles.filter(feed__type_materials = form.cleaned_data["type_materials"])
    if form.cleaned_data["institute"]:
        bdfiles = bdfiles.filter(feed__institute = form.cleaned_data["institute"])

return render(request, 'chat/files/buyfile.html', {'bdfiles': bdfiles, 'form':form})

html код:

forms.py

class FileFilterForm(forms.Form):

number_course = forms.IntegerField(label='Курс',required=False, widget=forms.NumberInput(attrs={'class': 'form-control'}))
number_semestr = forms.IntegerField(label='Семестр',required=False, widget=forms.NumberInput(attrs={'class': 'form-control'}))
subjectt = forms.CharField(label='Дисциплина',required=False,widget=forms.TextInput(attrs={'class': 'form-control'}))
type_materials = forms.CharField(label='Тип материала',required=False,widget=forms.TextInput(attrs={'class': 'form-control'}))
institute = forms.CharField(label='Институт',required=False,widget=forms.TextInput(attrs={'class': 'form-control'}))

Когда вы генерируете форму с помощью чего-то вроде {{form.as_p}}, все поля генерируются и отправляются, даже если некоторые из связанных с ними значений пусты, поскольку пользователь не делает никакого выбора.

Когда вы выписываете только несколько полей, недостающие поля вообще не отправляются.

Это означает, что в вашем файле views.py, когда вы ссылаетесь на них по

form.cleaned_data["number_course"]

вы можете получить ошибку недействительного ключа, поскольку данные с таким именем не были представлены.

Для исправления можно использовать

form.cleaned_data.get('number_course')

... который должен возвращать None, если такого ключа нет, а не выдавать ошибку

Вернуться на верх