为什么 django-comments-xtd 的评论永久链接会在 Wagtail 中转到 example.com?

问题描述

我正在使用 django-comments-xtd 在 Wagtail 中设置评论,我无法弄清楚的一件事是为什么我的评论永久链接一直转到 https://example.com/news/bloggy-test-post/#c1 而不是 https://localhost:8000/新闻/博客测试帖子/#c1.

我在 Wagtail Google 群组中发现了一个有类似问题的用户,他发现他们在 Wagtail 管理员中将“example.com”设置为他们的站点。但我的设置中只有一个站点,当前设置为“localhost”,端口为 8000。

Screenshot of the Wagtail admin site showing there is one site set to localhost with a port of 8000

我在所有文件和库中搜索了“example.com”,我发现的唯一其他设置是 base.py 中的 BASE_URL 设置。我尝试将其更改为 http://localhost:8000,但评论永久链接仍指向“example.com”。

我还缺少其他设置吗?或者我应该以另一种方式获取 URL?

目前,我在我的 models.py 文件中有这个用于抓取 url 的代码

    def get_absolute_url(self):
    return self.get_url()

这是我模板中的评论部分代码

    {% get_comment_count for page as comment_count %}

      <p>
      <a href="{% pageurl page %}#comments">
        {{ comment_count }} comment{{ comment_count|pluralize }}
      </a>
      {{ comment_count|pluralize:"has,have" }} been posted.
    </p>

    {% render_xtdcomment_tree for page %}
    {% render_comment_form for page %}

这是(希望)来自 django-comments-xtd 的 comment_tree.html 的相关部分:

<h6 class="mb-1 small d-flex">
    <div class="mr-auto">{{ item.comment.submit_date }}&nbsp;-&nbsp;{% if item.comment.url and not item.comment.is_removed %}<a href="{{ item.comment.url }}" target="_new">{% endif %}{{ item.comment.name }}{% if item.comment.url %}</a>{% endif %}{% if item.comment.user and item.comment.user|has_permission:"django_comments.can_moderate" %}&nbsp;<span class="badge badge-secondary">{% trans "moderator" %}</span>{% endif %}&nbsp;&nbsp;<a class="permalink" title="{% trans 'comment permalink' %}" href="{% get_comment_permalink item.comment %}">¶</a></div>
    <span>
      {% if not item.comment.is_removed %}
        {% if perms.comments.can_moderate %}
          {% if item.flagged_count %}
            <span class="badge badge-danger" title="{% blocktrans count counter=item.flagged_count %}A user has flagged this comment as inappropriate.{% plural %}{{ counter }} users have flagged this comment as inappropriate.{% endblocktrans %}">{{ item.flagged_count }}</span>
          {% endif %}
        {% endif %}
        {% if allow_flagging and item.flagged %}
          <i class="fas fa-flag text-danger" title="{% trans 'comment flagged' %}"></i>
        {% elif allow_flagging %}
          <a class="mutedlink"
             href="{% url 'comments-flag' item.comment.pk %}">
            <i class="fas fa-flag" title="{% trans 'flag comment' %}"></i>
          </a>
        {% endif %}
        {% if perms.comments.can_moderate %}
          <a class="mutedlink"
             href="{% url 'comments-delete' item.comment.pk %}"><i class="fas fa-trash-alt" title="{% trans 'remove comment' %}"></i></a>
        {% endif %}
      {% endif %}
    </span>
  </h6>

解决方法

Django 有自己的可选 Sites framework,这与 Wagtail 的站点概念不同。在标准的 Wagtail 项目模板中,这是关闭的(即 django.contrib.sites 被排除在 INSTALLED_APPS 之外),但您的项目可能启用了它,特别是如果您将 Wagtail 集成到现有的 Django 项目中。像 Wagtail 一样,Django 的站点记录保存在数据库中,我怀疑这是 example.com 引用隐藏的地方 - 如果您启用了 Django 管理站点(与 Wagtail 不同),您应该找到一个 Sites型号列在那里。

深入研究 django-comments-xtd 和 django-contrib-comments 代码表明 {% get_comment_permalink %} 标签返回的 URL 最终由 django.contrib.contenttypes.views.shortcut 视图处理,这确实是 {{3} }.

至于为什么添加第二个 Wagtail 站点可以规避这个问题:当 Wagtail 生成页面 URL 时,它会更愿意返回没有域的本地 URL(例如 <a href="/news/bloggy-test-post/">),因为它可以明确地这样做 - 就像这种情况当只定义了一个 Wagtail 站点时。一旦你添加了第二个站点,它就会切换到一个包含域的完整 URL——此时,Django 会识别出它已经被传递了一个完整的 URL,并且不会尝试应用自己的站点逻辑来“修复”它。