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

Я не смог понять, как подойти к решению этой проблемы, поэтому не могу сформулировать свой вопрос более конкретно, чем «кто-нибудь знает, как это сделать?»

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