我正在学习Django,当我使用Pinax Likes时出现405错误

时间:2019-05-29 10:27:13

标签: python django pinax

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文件,

控制台显示以下信息:

  

不允许使用方法(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

  • 然后我在base.html中添加了<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

错误的步骤是什么?谢谢!

1 个答案:

答案 0 :(得分:1)

我看不到像Pinax的小部件实际上如何与当前代码一起使用。坏了我看到您提出了一个问题,如果有人仍在积极维护它,他们可能会解决。或者您可以修复它并提出拉取请求。

{% likes_widget %}有两个问题:

  1. 如果没有ajax,它就无法工作,因为它只是一个链接,即它将向您的视图发送GET请求。但是该视图期望POST请求是合乎逻辑的,因为喜欢对数据库进行了更改,因此它为POST。因此,没有ajax,视图将引发405错误。

  2. 它使用eldarion-ajax发出ajax POST请求,但是由于它又只是一个a.click事件,因此不会发布任何数据,即,它不会发布CSRF令牌。该视图不允许丢失标记(它没有@csrf_exempt装饰器),因此它引发403错误。

现在,我唯一能解决的方法是编写自己的HTML和/或ajax,而不使用likes_widget。

  1. 您可以将like按钮包装在表单中,并用提交表单的<button>(而不是<a>标签)替换like按钮。这样,您可以在表单中包含{% csrf_token %}标签,然后该帖子就会起作用。这将刷新页面。

  2. 您可以编写自己的ajax调用来处理对like按钮的单击,然后将其发布到同一视图,并将csrftoken包含在发布的数据中。

这非常容易实现,您可以使用现有的像pinax这样的视图,因此只是HTML模板中的更改。