Я изучаю Django, когда я использую Pinax Likes, ошибка 405 - PullRequest
0 голосов
/ 29 мая 2019

Джанго 2.2.1

Когда я использую Pinax Likes (https://github.com/pinax/pinax-likes),, возникает ошибка 405.

Шаги следующие:

  • pip3 install pinax-likes

  • Добавлен 'pinax.likes', в файл settings.py проекта, затем добавил:

PINAX_LIKES_LIKABLE_MODELS = {
    "app.Post": {}
}
  • добавлено
re_path(r'^likes/', include(('pinax.likes.urls', 'pinax_likes'), namespace='pinax_likes')),

в файл проекта urls.py,

поместите эти HTML-файлы в /home/www/venv/templates/pinax/likes/,

  • Добавлена ​​
{% load pinax_likes_tags %}
{% likes_widget request.user post %}

в файл post.html,

  • python manage.py makemigrations app && python manage.py migrate && python manage.py runserver 0.0.0.0:8000

  • Открыть http://127.0.0.1:8000/post/13/, Похожий значок появляется при нажатии значка (URL: http://127.0.0.1:8000/like/14:13/), показывает следующее: HTTP ERROR 405

На консоли отображается следующая информация:

Метод не разрешен (GET): / likes / like / 14: 13 / Метод не разрешен: / likes / like / 14: 13 / [29 / Май / 2019 10:00:00] "GET / лайки / лайк / 14: 13 / HTTP / 1.1" 405 0

  • Затем я добавил <script src="{% static 'eldarion-ajax.min.js' %}"></script> в base.html,

После нажатия значка на консоли отобразится следующая информация:

Запрещено (токен CSRF отсутствует или неверен.): / Likes / like / 14: 13 / [29 / Май / 2019 10:01:31] "POST / лайки / лайк / 14: 13 / HTTP / 1.1" 403 2513

Какие шаги не так? Спасибо!

1 Ответ

1 голос
/ 29 мая 2019

Я не понимаю, как виджет pinax-like может работать с текущим кодом.Оно сломано.Я вижу, вы открыли проблему, если кто-то все еще активно поддерживает ее, они могут ее исправить.Или вы могли бы это исправить и предложить запрос на удаление.

Есть две проблемы с {% likes_widget %}:

  1. Он не может работать без ajax, потому что это просто ссылка, то есть он отправит запрос GET на ваш взгляд,Но представление ожидает POST-запрос, что логично, так как симпатия вносит изменения в базу данных, и поэтому должно быть POST.Следовательно, без ajax представление выдает ошибку 405.

  2. Он использует eldarion-ajax для выполнения запроса POST ajax, но, с другой стороны, это просто событие a.click, оно выиграло 'не публиковать какие-либо данные, т.е. он не публикует токен CSRF.Представление не разрешит отсутствующий токен (у него нет декоратора @csrf_exempt), поэтому выдает ошибку 403.

Теперь я вижу только один способ - написать свой собственный HTML и / или Ajax, а не использовать likes_widget.

  1. Вы можетеоберните кнопку «Мне нравится» в форму и замените кнопку «Мне нравится» на <button>, который отправляет форму (вместо тега <a>).Таким образом, вы можете включить тег {% csrf_token %} в форму, и сообщение будет работать.Это обновит страницу.

  2. Вы можете написать свой собственный вызов ajax, чтобы обработать нажатие кнопки «Мне нравится» и выполнить публикацию в том же виде и включить csrftoken в опубликованные данные.

Это довольно просто реализовать, вы можете использовать существующее представление типа pinax, так что это всего лишь изменение в вашем HTML-шаблоне.

...