Как сохранить значения из нескольких объектов select на одной форме с помощью Django HTMX
Представьте список дел с несколькими столбцами, включающими приоритет, статус, назначение, дату выполнения. Теперь у меня есть форма под этим списком, которая имеет ChoiceBox (и в одном случае ModelChoiceBox) для каждого из этих условий. Итак, установите Priority = 2, и список обновится только до 2. Теперь выберите Status = 3, например, и эти два фильтра должны быть объединены. Однако в моем представлении это не так. Значение последнего Select возвращается, но предыдущее значение сбрасывается на None. Вот уменьшенный пример с 2 селектами.
class FilterForm(forms.Form):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper(self)
self.helper.attrs = {"novalidate": '', }
priority = forms.ChoiceField(
choices=PRIORITY_CHOICES,
widget=forms.Select(attrs={
'hx-get': reverse_lazy('change-priority'),
'hx-target': '#tasklist',
'hx-trigger': 'change'
})
)
status = forms.ModelChoiceField(queryset=TaskStatus.objects.all(),
widget=forms.Select(attrs={
'hx-get': reverse_lazy('change-priority'),
'hx-target': '#tasklist',
'hx-trigger': 'change'
})
)
Вот уменьшенный вид:
def change_priority(request):
filtform = FilterForm(request.POST)
fpriority = filtform["priority"].value()
fstatus = filtform["status"].value()
tasklist = get_object_or_404(TaskList, owner=request.user)
if tasklist:
tasks = Task.objects.filter(priority=fpriority, status=fstatus)
context = {
"tasks": tasks,
"filtform": filtform,
}
return render(request, "planner/partials/tasklist.html", context)
return HttpResponse("Error - No Valid Task List")
Итак, изменение Priority отправляет правильное значение Selected в View, а Status становится None. Затем выберите Status и надейтесь сохранить Priority, но нет. Теперь я получаю правильное значение для Status, но Priority становится None.
Итак, вы видите, что я пытаюсь создать серию фильтров списка, которые динамически обновляют список и являются кумулятивными. Есть идеи, как я могу это сделать?
Поскольку вы не отправляете всю форму через HTMX, вам необходимо явно включить дополнительные элементы формы в запрос HTMX, используя атрибут hx-include .
class FilterForm(forms.Form):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper(self)
self.helper.attrs = {"novalidate": '', }
priority = forms.ChoiceField(
choices=PRIORITY_CHOICES,
widget=forms.Select(attrs={
'hx-get': reverse_lazy('change-priority'),
'hx-include': '[name="status"]',
'hx-target': '#tasklist',
'hx-trigger': 'change'
})
)
status = forms.ModelChoiceField(
queryset=TaskStatus.objects.all(),
widget=forms.Select(attrs={
'hx-get': reverse_lazy('change-priority'),
'hx-include': '[name="priority"]',
'hx-target': '#tasklist',
'hx-trigger': 'change'
})
)
Вы также можете поместить его на общий родительский элемент, поскольку он наследуется.