Как сохранить значения из нескольких объектов 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'
        })
     )

Вы также можете поместить его на общий родительский элемент, поскольку он наследуется.

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