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

Why are comment permalinks for django-comments-xtd going to example.com in Wagtail?

我正在使用 django-comments-xtd and one thing I'm having trouble figuring out is why my comment permalinks keep going to https://example.com/news/bloggy-test-post/#c1 而不是 https://localhost:8000/news/bloggy-test-post/#c1.

在 Wagtail 中设置评论

我在 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 %}

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

<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 code shows that the URL returned by the {% get_comment_permalink %} tag is ultimately handled by the django.contrib.contenttypes.views.shortcut view, which is indeed listed as making use of the Django sites framework

至于为什么添加第二个 Wagtail 站点可以解决这个问题:当 Wagtail 生成页面 URLs 时,它会更喜欢 return 没有域的本地 URLs(例如 <a href="/news/bloggy-test-post/">) 当它可以明确地这样做时——就像只定义一个 Wagtail 站点时的情况一样。添加第二个站点后,它会切换到包含域的完整 URL - 此时,Django 会识别它已通过完整 URL 并且不会尝试应用自己的站点逻辑到 'fix' 了。