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}