Я пытаюсь добавить функцию поиска в ListView, но она выдает ошибку Method Not Allowed (POST): error
Моя форма поиска:
<form class=" my-2 my-lg-0 d-flex flex-row-reverse" method=POST action="{% url 'memes:all' %}" >
{% csrf_token %}
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
<input class="form-control mr-sm-2" name="search" placeholder="Search" aria-label="Search">
</form>
Мой вид списка:
class MemeListView(ListView):
model = Meme
paginate_by = 100
ordering = ['-created_at']
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['now'] = timezone.now()
search_value = self.request.GET.get("search", False)
if search_value:
memes = Meme.objects.filter(name_contains=search_value)
objects = Meme.objects.filter(memes).select_related().distinct().order_by('-created_at')[:10]
context['meme_list'] = objects
context['search'] = search_value
return context
Мой url:
path('', MemeListView.as_view(), name='all'),
error: "GET / HTTP/1.1" 200 4455
Метод не разрешен (POST): /all/
Метод не разрешен: /all/
[01/Feb/2022 19:23:22] "POST /all/ HTTP/1.1" 405 0
Я сделал почти идентичную функциональность поиска в другом моем crud, и она, кажется, работает. В чем проблема?
Поиск обычно выполняется через GET-запрос, а не POST-запрос: POST-запросы обычно используются для создания, обновления и удаления сущностей.
Таким образом, ваша форма должна иметь method="GET":
<form class=" my-2 my-lg-0 d-flex flex-row-reverse" method="GET" action="{% url 'memes:all' %}">
…
</form>
Поскольку это GET-запрос, нет необходимости использовать {% csrf_token %}, так как подделка межсайтового запроса не приведет к созданию, обновлению или удалению сущности.