2009-07-22 5 views
6

(今のDjango 1.1がリリース候補状態であること、これを聞いて良い時間である可能性があります。)Django 1.1で認証されたコメントはありますか?

私は、認証済みのコメントをサポートするために、Djangoのコメントアプリを拡張する方法をどこでも焼け付くようなされてきました。コメントモデルを何度か読んだ後、ForeignKeyUserが既に存在することがわかりました。 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が空であるとちょうど正しい、関連するプロファイルモデルからその情報を引き出すという事実を無視する必要がありますか?

最終的には答えは簡単かもしれませんが、私はそれが書かれていない、あるいは話されていないことにちょうど驚いています。

答えて

1

Thejuが認証されたコメントのアプリを書いた - http://thejaswi.info/tech/blog/2009/08/04/reusable-app-authenticated-comments/

+0

私は最初にこの回答に投票しましたが、しばらくの間、Thejuのソリューションを使って作業をしたところ、それは制限されていました。私は今、手動でフォームを構築し、Djangoが期待するすべてのフィールドを固執したいと考えています(下記参照)。 – shacker

1

ユーザー名とパスワード以外の追加のアカウントデータには、プロファイルモデルを使用します。あなたがプロフィールにこの行が含まれている場合は、)(user.get_profileを呼び出すことができます。

settings.pyで
user = models.ForeignKey(User, unique=True) 

と、この行:

AUTH_PROFILE_MODULE = 'yourapp.Profile' 
+0

プロフィールモデルから情報を取得する方法はわかりましたが、ありがとうございます。あなたはコメントに '' user''を渡すことについて何らかの洞察を持っているでしょうか? –

0

コメントによると、それはだのいずれか、または:他のフィールドは、userに設定されていない場合に使用されます。関連する列が間違いなくNULLでないことを確認しましたか?フィールドレベルで通常required=Falseを意味するblank=Trueとマークされています。実際に試してみたら、どのようなエラーが出ていますか?

1

最初に、コメントアプリは既に認証済みユーザーと匿名ユーザーの両方をサポートしているため、認証済みユーザーからのコメントのみを受け入れるとしますか?

Thejaswi Puthrayaはseriesarticlesをブログに掲載しました。基本的に、彼はnameemailのフィールドをコメントフォームにあらかじめ入力して、それらを隠しフィールドに置き換え、post_commentのラッパービューを定義して、コメントを投稿したユーザーがログインしたユーザーと同じであることを保証します。かなり単純だと思われますが、ちょっと面倒なこともあります。

彼のブログは現在ダウンしているようです...うまくいけば、それは一時的なものです。

3

は、私はあなたがDjangoの内部に関する質問を思い付くとき、あなたがソースを見てみることをお勧めします。

start of post_comment viewを見ると、POST querydictがコピーされ、ユーザーの電子メールと名前が挿入されていることがわかります。それらは依然として必要です(form's source参照)ので、これらの詳細はフォームに入力するか、ユーザーが入力する必要があります。

あなたの質問にSuperjoeに答えるために、ビューは保存前にユーザーにコメントを添付します(near the end of the post_comment view参照)。

+0

クリスおかげで何らかの理由で私は自分の意見を見てモデルを見ていた。ですから、技術的には、サブクラス化されたフォームで 'exclude()'を使用して、名前、電子メール、URLフィールドを削除するだけです。試しに値する、もう一度感謝します。 :) –

+0

はい、 'exclude =(...)'またはフォームの '__init__'でロジックを実行し、ユーザーが渡され、ユーザーが認証されている場合はフィールドをオフにすることができます。 – SmileyChris

4

ワードプレスや他のシステムでは、この誰でも思いつきそうします。ログインしている場合、コメントフォームは「正しいことをする」だけで、名前/電子メール/ URLフィールドを削除する必要があります。フレームワークがあなたのためにしなければならない重い持ち上げのようなものではありませんか?

モデルをサブクラス化して踊るのではなく、テンプレートで手作業でフォームを構築し、必要な隠しフィールドの値を提供する方が簡単です。これは、認証されたユーザーのみからのコメントを受け付けるサイトのために完璧に動作します:これは目に見えるハニーポット場を去ること

{% 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ラインを交換したい場合。