Django 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文件,
https://github.com/pinax/pinax-templates/tree/master/pinax/templates/templates/pinax/likes
中的文件,将这些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 / May / 2019 10:00:00]“ GET / likes / like / 14:13 / HTTP / 1.1” 405 0
<script src="{% static 'eldarion-ajax.min.js' %}"></script>
单击图标后,控制台将显示以下信息:
禁止(CSRF令牌丢失或不正确。):/ likes / like / 14:13 / [29 / May / 2019 10:01:31]“ POST / likes / like / 14:13 / HTTP / 1.1” 403 2513
错误的步骤是什么?谢谢!
答案 0 :(得分:1)
我看不到像Pinax的小部件实际上如何与当前代码一起使用。坏了我看到您提出了一个问题,如果有人仍在积极维护它,他们可能会解决。或者您可以修复它并提出拉取请求。
{% likes_widget %}
有两个问题:
如果没有ajax,它就无法工作,因为它只是一个链接,即它将向您的视图发送GET请求。但是该视图期望POST请求是合乎逻辑的,因为喜欢对数据库进行了更改,因此它应为POST。因此,没有ajax,视图将引发405错误。
它使用eldarion-ajax发出ajax POST请求,但是由于它又只是一个a.click
事件,因此不会发布任何数据,即,它不会发布CSRF令牌。该视图不允许丢失标记(它没有@csrf_exempt装饰器),因此它引发403错误。
现在,我唯一能解决的方法是编写自己的HTML和/或ajax,而不使用likes_widget。
您可以将like按钮包装在表单中,并用提交表单的<button>
(而不是<a>
标签)替换like按钮。这样,您可以在表单中包含{% csrf_token %}
标签,然后该帖子就会起作用。这将刷新页面。
您可以编写自己的ajax调用来处理对like按钮的单击,然后将其发布到同一视图,并将csrftoken包含在发布的数据中。
这非常容易实现,您可以使用现有的像pinax这样的视图,因此只是HTML模板中的更改。