如何通过移除不必要的字段扩展Django评论框架?

14 投票
3 回答
3493 浏览
提问于 2025-04-15 20:05

我在看Django的文档,了解评论框架以及如何自定义它(http://docs.djangoproject.com/en/1.1/ref/contrib/comments/custom/)。

在那一页上,它展示了如何给表单添加新字段。但是我想做的是移除一些不必要的字段,比如网址、邮箱(还有其他一些小的修改)。

在同一文档页面上,它提到要从BaseCommentAbstractModel扩展我的自定义评论类,但就到这里为止,我已经走到这一步了,现在不知道该怎么做。我找不到关于这个具体方面的任何信息。

3 个回答

2

你可以试试用一个自定义的模板来替换评论表单,这样就只显示你想要的字段。具体可以参考这个链接

4

这里有一个简单明了的总结,告诉你如何优雅地处理这个问题。我们不是通过隐藏表单中的元素或其他不太干净的方法,而是通过实际的评论框架子类化来解决。具体的内容可以在这个链接找到:Django评论:想要去掉用户网址,而不是扩展模型。该怎么做?

基本上,你需要创建一个CommentForm的子类,然后修改它的get_comment_create_data(self)方法,接着把你不想要的属性(比如邮箱、网址等)去掉。

J

12

我最近实现了Ofri提到的解决方案,因为我只想要一个简单的“评论”字段来进行评论(就像Stack Overflow那样,不需要“姓名”、“邮箱”和“网址”)。

为了定制默认的评论表单和评论列表显示,我在我的根“templates”目录下创建了一个“comments”文件夹,并覆盖了两个默认的评论模板。

我的“/templates/comments/form.html”文件内容是:

{% load comments i18n %}
{% if user.is_authenticated %}
    <form action="{% comment_form_target %}" method="post">
        {% csrf_token %}
        {% if next %}<input type="hidden" name="next" value="{{ next }}" />{% endif %}
        {% for field in form %}
            {% if field.is_hidden %}
                {{ field }}
            {% else %}
                {% if field.name != "name" and field.name != "email" and field.name != "url" %}
                    {% if field.errors %}{{ field.errors }}{% endif %}
                    <p {% if field.errors %} class="error"{% endif %} {% ifequal field.name "honeypot" %} style="display:none;"{% endifequal %}>
                    {{ field }}
                    </p>
                {% endif %}
            {% endif %}
        {% endfor %}
        <input type="submit" name="post" class="submit-post" value="{% trans "Add Comment" %}" />
    </form>
{% else %}
    I'm sorry, but you must be <a href="javascript:alert('send to login page')">logged in</a> to submit comments.
{% endif %}

这个表单和默认的评论表单只有一点点不同,主要是去掉了不必要的“姓名”、“邮箱”和“网址”输入框的显示。

我的“/templates/comments/list.html”文件内容是:

<div class="comment_start"></div>
{% for comment in comment_list %}
    <div class="comment">
       {{ comment.comment }} 
       (from <a href="javascript:alert('show user profile/stats')">{{ comment.user }}</a> - {{ comment.submit_date|timesince }} ago)
    </div>
{% endfor %}

在我想要放置表单的页面上,我首先调用 {% load comments %},然后用 {% render_comment_form for [object] %} 来显示表单,或者用 {% render_comment_list for [object] %} 来生成该对象的评论列表(把 [object] 替换成你实际的对象名称)。

这个方法对我来说非常有效,而且还让我享受到了django评论系统提供的其他“免费”功能(比如审核、标记、订阅、以及多态关联等……)

撰写回答