Django form.cleaned_data переключает значения между полями выбора класса формы

Я пытаюсь динамически фильтровать объекты модели в зависимости от того, что пользователь выбирает в форме. Форма позволяет выбирать из двух выпадающих списков. Выбор из любого выпадающего списка необязателен. Если пользователь ничего не выберет и нажмет кнопку Submit, то появится пустая страница результатов поиска. Мне кажется, что я не сделал некоторые вещи правильно. Когда я извлекаю данные из form.cleaned_data, когда field_1 выбирается только пользователем, его значение присваивается field_2, а field_1 в итоге получает строку "field_1". То же самое происходит, когда выбирается только field_2. Почему он переключает присвоение значения и присваивает строковое имя каждого из них самому себе?

Выход

self.kwargs = {"field_1": "field_1", "field_2": field_1_value}
self.kwargs = {"field_1": field_2_value, "field_2": "field_2"}

Однако, когда пользователь выбирает значение из каждого выпадающего списка, значения присваиваются правильно.

Вот мой код:

views.py

class MyDataView(generic.ListView):
    template_name = "my_data/my_data.html"
    context_object_name = "my_data_list"

    def get_context_data(self, **kwargs):
        context = super(MyDataView, self).get_context_data(**kwargs)
        context["form"] = SearchForm
        return context

    def get_queryset(self):
        # Update and create data in the MyData model
        populate_my_data()

        return MyData.objects.all()


class MyDataSearcher(FormView):
    form_class = SearchForm

    def form_valid(self, form):
        field_1 = form.cleaned_data.get("field_1 ", "")
        field_2 = form.cleaned_data.get("field_2 ", "")

        kwargs = {}

        if field_1 :
            kwargs["field_1 "] = field_1 

        if field_2 :
            kwargs["field_2 "] = field_2 
    
        # Redirect to the search results page
        return HttpResponseRedirect(reverse("my_data:search_results_view", kwargs=kwargs))


class SearchResultsView(generic.ListView):
    model = MyData
    template_name = "my_data/search_results.html"

    def get_context_data(self, **kwargs):
        context = super(SearchResultsView, self).get_context_data(**kwargs)

        my_data_list = []
        field_1= self.kwargs.get("field_1", "")
        field_2 = self.kwargs.get("field_2 ", "")
        context["no_result"] = ""

        filters = {}

        if filters:
            try:
                my_data_list = MyData.objects.filter(**filters)
            except (KeyError, MyData.DoesNotExist):
                return render(
                    self.request,
                    "my_data/table_viewer.html",
                    {
                        "error_message": "No data filters selected"
                    }
                )
        else:
            context["no_result"] = "Please select from the lists"

        context["my_data_list"] = my_data_list
        context["field_1"] = field_1
        context["field_2"] = field_2

        # NOTE: For debugging
        context["kwargs"] = self.kwargs

        return context

forms.py

from django import forms

from .populate_data import PopulateChoices


POPULATED_CHOICES = PopulateChoices()


class SearchForm(forms.Form):
    field_1 = forms.ChoiceField(
        choices=POPULATED_CHOICES.field_1_choices,
        label="Field 1",
        required=False
    )

    field_2 = forms.ChoiceField(
        choices=POPULATED_CHOICES.field_2_choices,
        label="Field 2",
        required=False
    )

urls.py

urlpatterns = [
    path("table_viewer/", views.MyDataView.as_view(), name="my_data_view"),
    path("table_viewer/search/", views.MyDataSearcher.as_view(), name="my_data_searcher"),
    path("search_results/<str:field_1>/<str:field_2>/", views.SearchResultsView.as_view(), name="search_results_view"),
    path("search_results/field_1/<str:field_1>/", views.SearchResultsView.as_view(), name="search_results_view"),
    path("search_results/<str:field_2>/field_2/", views.SearchResultsView.as_view(), name="search_results_view"),
    path("search_results/", views.SearchResultsView.as_view(), name="search_results_view")
]

forms.py

<form action={% url "my_data:my_data_searcher" %} method="post">
  {% csrf_token %}
  {{ form }}
  <input name="submitted" type="submit" value="Search">
</form>

Я ожидаю, что field_1 будет только в self.kwargs, когда выбрано только field_1.

self.kwargs = {"field_1": field_1_value}

И когда field_2 только выбран, он должен быть только в self.kwargs.

self.kwargs = {"field_2": field_2_value}
Вернуться на верх