<form method="get"> отправляется как POST (Django)

Я пытаюсь заставить django-filter работать, и он работал, но теперь он внезапно остановился.

Проблема в том, что кнопка submit в фильтре, похоже, отправляет POST запрос, а не GET

Ниже приведен фрагмент HTML-кода

<div class="form-group">
    <form method="POST">
      {% csrf_token %}
      {{form|crispy}}
      <button class="btn btn-outline-success" type="submit">Add product</button>
</div>


<div id="filter-menu">
      <form method="get">
        {{filter.form.nick_name|as_crispy_field}}
        <br>
        {{filter.form.domain|as_crispy_field}}
        <br>
        <button class="btn btn-outline-success" type="submit">Apply filter</button>
      </form>
</div>

У меня есть кнопка отправки POST-запроса, как видно выше, и похоже, что именно она срабатывает, так как при отладке приложения, request.method == "POST" при нажатии кнопки apply filter

Если нужно, фрагмент моего представления здесь (опущены сообщения и прочее)

def MyView(request):
    user = request.user
    user_products = MyModel.objects.filter(user=user).all()
    
    ### Create filters ###
    filter = get_user_filter_fields_wishlist(user_products) #Helper function for returning filters
    filter = filter(request.GET,queryset = user_products)

    if request.method == "POST":
        post_form = MyForm(request.POST)    
        if post_form.is_valid():
           
            filter = get_user_filter_fields_wishlist(user_products)
            filter = filter(request.GET,queryset = user_products)
            form = MyForm()
            context = {
            "form":form,
            "filter":filter
            }

            return render(request, "myapp/my_html.html",context=context)
        else:
            #invalid post_form
            context = {
                "form":post_form,
                "filter":filter
            }
            return render(request, "myapp/my_html.html",context=context)        
    else: #Get request
        form = MyForm()
        context = {
            "form":form,
            "filter":filter
        }
        
    return render(request, "myapp/my_html.html",context=context)

Все просто, не так ли? Верхняя форма имеет метод post и вы забыли добавить для него... Используйте следующий код.

<div class="form-group">
    <form method="POST">
      {% csrf_token %}
      {{form|crispy}}
      <button class="btn btn-outline-success" type="submit">Add product</button>
</form>
</div>


<div id="filter-menu">
        <form method="get">
          {{filter.form.nick_name|as_crispy_field}}
          <br>
          {{filter.form.domain|as_crispy_field}}
          <br>
          <button class="btn btn-outline-success" type="submit">Filtrér</button>
        </form>
        
        <form method="get">
          {{filter.form.nick_name|as_crispy_field}}
          <br>
          {{filter.form.domain|as_crispy_field}}
          <br>
          <button class="btn btn-outline-success" type="submit">Dummy</button>
          </form>
</div>

Проблема в том, что он принимает все остальные формы за часть первой формы, которая является единственной формой с методом post. Вот почему вы получаете результаты post. Надеюсь, это поможет. Проголосуйте за ответ, если он поможет.

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