Почему я не могу фильтровать данные по одному известному признаку в 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, если такого ключа нет, а не выдавать ошибку