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 のアプリからコピーして問題を修正しました。具体的には、パート 2 に関する Joshua Works のコメントを参照してください。

于 2009-12-07T21:56:54.297 に答える