<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. Надеюсь, это поможет. Проголосуйте за ответ, если он поможет.