【问题标题】:'str' object has no attribute '_meta' error when setting up django-comments-xtd per documentation根据文档设置 django-comments-xtd 时,“str”对象没有属性“_meta”错误
【发布时间】:2023-04-09 12:45:01
【问题描述】:

我的网站实际上是一个 wagtail 网站,尽管我不确定这是否会有所不同。这是一个简单的博客应用程序,其中包含一个用于查看帖子的博客页面和一个用于显示每个帖子的页面。

我按照here 的说明设置 django-cmets-xtd

文档说要实现以下代码以获取每个帖子页面上显示的评论计数。

{% get_comment_count for object as comment_count %}
<div class="text-center" style="padding-top:20px">
  <a href="{% url 'blog:post-list' %}">Back to the post list</a>
  &nbsp;&sdot;&nbsp;
  {{ comment_count }} comments have been posted.
</div>

我将实际链接更改为以下内容,因为这就是我网站中的内容(根据另一个教程构建)

<p><a href="{{ page.get_parent.url }}">Return to blog</a></p>

据我所知,我认为这样更改网址不会导致问题。我还确保在文件开头加载 cmets。

实际错误是:

Error during template rendering

In template /home/jake/blog/blog/post_page.html, error at line 8
'str' object has no attribute '_meta'

第8行指的是这一行:

{% get_comment_count for object as comment_count %}

谁能更详细地解释这个错误?

【问题讨论】:

  • object 是什么?我猜是一个空字符串''。如果您打开 Python 并执行&gt;&gt;&gt; ''._meta,则会收到错误AttributeError: 'str' object has no attribute '_meta'。难道是 django-cmets-xtd 保持每页的评论数?例如:{% get_comment_count for page as comment_count %}
  • 将对象更改为页面有效!这对我来说似乎很奇怪。为什么文档会告诉您输入会返回错误的代码?是否可能与使用 wagtail 有关?
  • Django 模板允许未定义变量。空变量不会引发错误。这个概念很有用。当上下文不提供变量时,它将默认为空字符串。在基于 Django 类的视图和大多数 Django 文档中使用{{ object }}obj。因为obj 可以是任何对象(披萨、汽车、问题)。 Wagtail 中的默认对象是 Page 对象。 page 变量名选择得很好。我想真正的问题是你不知道上下文:所有用于填充模板的变量及其值。
  • Wagtail 页面既是模型又是视图。当一个 url 被解析时 Page.serve 被调用 github.com/wagtail/wagtail/blob/master/wagtail/core/… 调用 get_context 它返回一个字典。 {'page': self, 'self': self, 'request': request}。见github.com/wagtail/wagtail/blob/master/wagtail/core/…。上下文中没有object! django-cmets-xtd 开发人员刚刚编写了 Django 代码。您可以评论任何对象。您决定将它与 Wagtail 结合使用。所以对象是一个页面。没有错。
  • 感谢您的解释!我是 django 和 wagtail 的新手,所以同时学习两者。如果您将您的评论作为答案,我将很乐意接受它,并且我认为这对使用 django-cmets-xtd 和 wagtail 的任何其他初学者很有用。

标签: django wagtail django-comments


【解决方案1】:

Django django-cmets-xtd 将 cmets 存储在对象上。在您的情况下,对象是 Wagtail 页面。变化:

{% get_comment_count for object as comment_count %}

收件人:

{% get_comment_count for page as comment_count %}

object 变量是一个空字符串''。这是 django-cmets-xtd 代码中某处发生的事情的演示:

>>> ''._meta
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute '_meta'

Wagtail Page 既是模型又是视图。当一个 url 被解析时,Page.serve 被调用。调用get_context 并返回一个字典。

{'page': self, 'self': self, 'request': request}

上下文 - 所有变量及其值 - 用于填充模板。上下文中没有object

Django 模板允许未定义变量。空变量不会引发错误。这个概念很有用。当上下文不提供变量时,它将默认为空字符串。

当文档显示示例代码并提及{{ object }}obj 时,它们的意思是“一个对象”。任何对象(比萨饼、汽车、问题)。你的对象。 Wagtail 中的默认对象是 Page 对象。您应该使用 page 变量。

【讨论】:

    【解决方案2】:

    为了像我这样的参考目的,只需使用

    {% get_comment_count for NameOfModel as comment_count %}
    

    NameOfModel 正是您在 views.py 中定义模型的方式(我使用的是 django)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-23
      • 2021-04-02
      • 2023-02-06
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      • 2021-09-09
      相关资源
      最近更新 更多