Отправка данных в форму с использованием данных из предыдущего GET-запроса
У меня есть приложение-словарь, в котором пользователи могут просматривать слова (леммы), отфильтрованные по их первой букве. Я хотел бы, чтобы пользователи могли фильтровать результаты по сочетаниям частей речи (каждая лемма имеет ровно одну часть речи) или тегов (каждая лемма может иметь от 0 до многих тегов); например, выбрать только те леммы, которые являются существительными или глаголами или помечены как сельскохозяйственная лексика.
В настоящее время у меня есть две формы, одна для выбора первой буквы, другая для выбора части речи/тега (фасеты).
class LemmaInitialLetterForm(forms.Form):
LETTERS = [
...
]
initial = forms.ChoiceField(
widget=forms.RadioSelect(
attrs={"class": "lem_init"}
),
choices=LETTERS
)
class FacetSideBarForm(forms.Form):
poss = forms.MultipleChoiceField(
required=False,
widget=forms.CheckboxSelectMultiple,
label='Parts of speech',
choices=list()
)
tags = forms.MultipleChoiceField(
required=False,
widget=forms.CheckboxSelectMultiple,
label='Tags',
choices=list()
)
def __init__(self, poss=None, tag_list=None, *args, **kwargs):
super(FacetSideBarForm, self).__init__(*args, **kwargs)
if poss:
self.fields['poss'].choices = [
(pos, pos)
for pos in poss
]
if tag_list:
self.fields['tags'].choices = [
(tag, tag)
for tag in tag_list
]
Мне удалось отобразить список лемм, отфильтрованных по первой букве, в следующем виде:
class LemmaListView(generic.FormView):
template_name = "emedict/lemma_home.html"
lemmalist = None
def get(self, request, *args, **kwargs):
form = LemmaInitialLetterForm(self.request.GET or None)
if form.is_valid():
initial = request.GET["initial"]
self.lemmalist = Lemma.objects.filter(
Q(cf__startswith=initial.lower()) | Q(cf__startswith=initial.upper()),
pos__type="COM"
).order_by("sortform")
else:
self.lemmalist = Lemma.objects.filter(
Q(cf__startswith="a") | Q(cf__startswith="A"),
pos__type="COM"
).order_by("sortform")
return self.render_to_response(self.get_context_data(form=form))
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["lem_search_form"] = LemmaAdvancedSearchForm
context["lem_init_form"] = LemmaInitialLetterForm
context["sidebar_form"] = FacetSideBarForm
context["lemmalist"] = self.lemmalist
if self.lemmalist:
context["sidebar_form"] = FacetSideBarForm(
Pos.objects.filter(id__in=self.lemmalist.values("pos")),
Tag.objects.filter(id__in=self.lemmalist.values("tags"))
)
return context
Я хочу иметь возможность затем использовать FacetSideBarForm
для фильтрации этих результатов, используя текущую букву, которая фильтрует весь список Лемма и сохраняет тот же путь, например, переходя от .../lemma?initial=A
к .../lemma?initial=A&poss=verb&poss=noun&tags=speaking
. Все, что мне удалось сделать до сих пор, - это заставить FacetSideBarForm вести к другому представлению, которое фильтрует все леммы по части речи и тегам, но отправляет пользователя по новому пути и теряет первоначальный буквенный фильтр.
Я не смог понять, как подойти к решению этой проблемы, поэтому не могу сформулировать свой вопрос более конкретно, чем «кто-нибудь знает, как это сделать?»