0

所以,我正在使用 django.contrib.comments。我已经安装好了,但不是笨拙的默认评论表单,我想使用一个自定义表单模板,它只显示一个文本区域和提交按钮。

这背后的基本原理是,用户只有在已经通过身份验证的情况下才能看到表单,我希望保持表单简单并自动选择他们的用户名等。

我已经实现了一个自定义表单,但是当我尝试提交它时出现错误。

这是我在带有评论表单的页面的模板中拥有的内容(条目是从视图传递的对象):

{% load comments %}
{% render_comment_form for entry %}

这是我在 /templates/comments/form.html 中的 HTML:

{% if user.is_authenticated %}
    <p>Submit a comment:</p>
    <form action="/comments/post/" method="post">
    <textarea name="comment" id="id_comment" rows="2" style="width: 90%;"></textarea>
            <input type="hidden" name="options" value="{{ options }}" />
            <input type="hidden" name="target" value="{{ target }}" />
            <input type="hidden" name="gonzo" value="{{ hash }}" />
            <input type="hidden" name="next" value="{{ entry.get_absolute_url }}" /> 
             <span style="float:right;"><input type="submit" name="post" value="Add"></span>
    </form>
    {% else %}
        <p>Please <a href="/login/">log in</a> to post a comment.</p>
    {% endif %}

它最初呈现正常,但是当我尝试提交评论表单时,我收到以下 Django 错误:

Comment post not allowed (400)
Why:    Missing content_type or object_pk field.

任何人都可以帮忙吗?

4

2 回答 2

1

评论模型使用通用外键映射到评论对象,例如博客条目。这些是标准评论表单中包含的必填隐藏字段。

来自 django.contrib.comments.models

...
class CommentSecurityForm(forms.Form):
    """
    Handles the security aspects (anti-spoofing) for comment forms.
    """
    content_type  = forms.CharField(widget=forms.HiddenInput)
    object_pk     = forms.CharField(widget=forms.HiddenInput)
...

如果您没有更改表单类并且只想更改 html 模板,那么您可以通过在所有隐藏字段上添加 for 循环来包含这些字段。

{% for hidden in form.hidden_fields %}
    {{ hidden }}
{% endfor %}
于 2009-12-07T21:34:36.743 回答
1

通过从Theju 的应用程序复制来解决问题- 特别是,请参阅 Joshua Works 对第 2 部分的评论。

于 2009-12-07T21:56:54.297 回答