【问题标题】:A user with no email can't post a comment using Django's comments framework没有电子邮件的用户无法使用 Django 的评论框架发表评论
【发布时间】:2012-03-30 17:02:17
【问题描述】:

我已经用我自己的覆盖了 cmets 框架的 form.html 模板

{% load comments i18n %}
<form action="{% comment_form_target %}" method="post">{% csrf_token %}
    <div><input type="hidden" name="next" value="{{ request.get_full_path }}" /></div>

    {% for field in form %}
        {% if field.is_hidden %}
            <div>{{ field }}</div>
        {% else %}
            {% if field.name != "name" and field.name != "url" and field.name != "email" %}
                {% if field.errors %}{{ field.errors }}{% endif %}
                <p
                    {% if field.errors %} class="error"{% endif %}
                    {% ifequal field.name "honeypot" %} style="display:none;"{% endifequal %}
                >
                    {{ field.label_tag }}<br />
                    {{ field }}
                </p>
            {% endif %}
        {% endif %}
    {% endfor %}

    <p class="submit">
        <input type="submit" name="post" class="submit-post" value="{% trans "Post" %}" />
    </p>
</form>

它几乎只呈现所需的隐藏字段(出于安全考虑)和 cmets 字段。所有comment.user 自动设置为当前登录用户request.user。这是呈现的 HTML:

<form action="/comments/post/" method="post"><div style='display:none'><input type='hidden' name='csrfmiddlewaretoken' value='bd05094c2e3ba80e1fbec8a4237b132c' /></div>
    <div><input type="hidden" name="next" value="/doors/orders/1/" /></div>
    <div><input type="hidden" name="content_type" value="doors.order" id="id_content_type" /></div>
    <div><input type="hidden" name="object_pk" value="1" id="id_object_pk" /></div>
    <div><input type="hidden" name="timestamp" value="1333125894" id="id_timestamp" /></div>
    <div><input type="hidden" name="security_hash" value="c6791aafdd682cd8db5595681073c9a21c5fe7dd" id="id_security_hash" /></div>
    <p>
        <label for="id_comment">Comment</label><br />
        <textarea id="id_comment" rows="10" cols="40" name="comment"></textarea>
    </p>
    <p style="display:none;" >
        <label for="id_honeypot">If you enter anything in this field your comment will be treated as spam</label><br />
        <input type="text" name="honeypot" id="id_honeypot" />
    </p>
    <p class="submit">
        <input type="submit" name="post" class="submit-post" value="Post" />
    </p>
</form>

问题是我注意到如果登录的用户没有电子邮件,那么 cmets 会转到 preview.html(我没有覆盖它)。这是截图:

这是一个安全问题,因为它允许某人在发布之前更改他们的姓名,而不是使用登录用户的姓名(当我列出 cmets 时,我使用 comment.user.get_full_name 而不是 comment.name,所以这不是问题,但它仍然可能在管理页面中令人困惑)。

所以我的问题是:

  1. 如何允许没有电子邮件的用户发表评论?
  2. 我如何不允许表单转到preview.html?
  3. 我的代码和设计到目前为止还好吗?

【问题讨论】:

  • Django 的 cmets 远非完美。但是您可以覆盖它们并使用您自己的模型和表单。
  • 但他们确实采取了一些良好的安全措施,例如蜜罐字段、双重发布、时间戳 POST、安全哈希等。
  • 你不需要把它全部扔掉。只需更改模型和形式(也可以从 Django 的 contrib 继承)。

标签: python django django-templates django-comments


【解决方案1】:

好吧,您可以使用customization 文档来创建一个自定义应用程序来处理来自 cmets 框架的 cmets。您应该在设置文件中设置COMMENTS_APP = 'my_comment_app',并在应用程序的__init__.py 中指定get_form() 方法,该方法应返回您的自定义表单。

自定义表单应基于contrib.comments.forms.CommentForm 并应如下所示:

class CustomForm(comment_forms.CommentForm):
    def __init__(*args, **kwargs):
        super(CustomFors, self).__init__(*args, **kwargs)
        self.fields["email"].required = False

preview.html 被渲染是因为表单包含错误(需要 emai,但用户没有它,因此未填充)。如果没有错误 - 将不会显示预览。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    相关资源
    最近更新 更多