Django 1.1中的认证评论?

6 投票
6 回答
1194 浏览
提问于 2025-04-15 13:04

(现在Django 1.1已经进入候选发布状态,问这个问题可能正合适。)

我到处寻找扩展Django评论应用的方法,以支持经过认证的评论。在仔细阅读评论模型几次后,我发现已经有一个指向UserForeignKey

来自django.contrib.comments.models

class Comment(BaseCommentAbstractModel):
    """
    A user comment about some object.
    """

    # Who posted this comment? If ``user`` is set then it was an authenticated
    # user; otherwise at least user_name should have been set and the comment
    # was posted by a non-authenticated user.
    user        = models.ForeignKey(User, verbose_name=_('user'),
                    blank=True, null=True, related_name="%(class)s_comments")
    user_name   = models.CharField(_("user's name"), max_length=50, blank=True)
    user_email  = models.EmailField(_("user's email address"), blank=True)
    user_url    = models.URLField(_("user's URL"), blank=True)

我似乎无法理解如何设置user如果我直接使用评论功能,即使我已经登录,仍然似乎需要填写其他字段。我在想,是不是应该重写表单,然后在那儿处理?另外,如果我使用user,我是不是可以忽略user_nameuser_emailuser_url这些字段为空的事实,而是直接从相关的用户资料模型中获取这些信息,对吗?

虽然最后的答案可能很简单,但我就是觉得这个问题没有被写出来或者讨论过,挺让人惊讶的。

6 个回答

3

我建议你在对Django内部机制有疑问时,去看看它的源代码。

如果我们查看一下post_comment视图的开头,会发现POST请求的数据被复制了,并且用户的邮箱和名字被插入其中。这些信息是必须的(在表单的源代码中可以看到),所以这些细节要么需要在表单中填写,要么用户必须提供这些信息。

至于你问Superjoe的问题,视图在保存评论之前会把用户信息附加到评论上(可以在post_comment视图的末尾看到)。

4

WordPress和其他系统让这件事变得非常简单。如果你已经登录了,评论表单应该自动去掉名字、邮箱和网址这些字段。这不正是框架应该为你做的事情吗?

与其为了一个本来应该很简单的事情去搞复杂的子类模型,我觉得直接在模板里手动构建表单更简单,并提供它需要的隐藏字段值。这样做对于只接受已登录用户评论的网站效果很好:

{% if user.is_authenticated %}
{% get_comment_form for [object] as form %} 
<form action="{% comment_form_target %}" method="POST"> 
    {% csrf_token %}
    {{ form.comment }} 
    {{ form.honeypot }} 
    {{ form.content_type }} 
    {{ form.object_pk }} 
    {{ form.timestamp }} 
    {{ form.security_hash }} 
    <input type="hidden" name="next" value="{% url [the_view] [object].id %}" />
    <input type="submit" value="Add comment" id="id_submit" /> 
</form> 
{% else %}
    <p>Please <a href="{% url auth_login %}">log in</a> to leave a comment.</p>
{% endif %} 

需要注意的是,这样做会让蜜罐字段可见;你需要在CSS里把它隐藏起来:

#id_honeypot {
    visibility:hidden;
}

如果你想让匿名用户和已登录用户都能评论,只需把上面提到的auth_login那一行替换成标准的评论表单调用即可。

1

Theju 创建了一个可以进行身份验证的评论应用程序 — http://thejaswi.info/tech/blog/2009/08/04/reusable-app-authenticated-comments/

撰写回答