2011-12-30 8 views
0

既存のコンテキストを調べるコンテキストプロセッサを作成したいと思います。フォームがある場合は、そのオブジェクトを編集する権限があることを確認してください。そうでない場合は、そのコンテキスト変数を上書きします。ユーザー許可を確認するDjangoコンテキストプロセッサ

コンテキストプロセッサー内から既存のコンテキストを読み取るにはどうすればよいですか?

編集: このタイプのコンテキストプロセッサを使用する理由は、各ビューのif文でチェックパーミッションを使用しないようにするためです。一部のユーザーは読み取り/書き込みアクセス権を持ち、他のユーザーは読み取り専用で、他のユーザーはオブジェクトレベルではアクセス権を持ちません。ビューが処理された後にフォームを操作したいと思います。

+0

*はそのオブジェクトを編集する権限を持っています* – jpic

+0

権限はオブジェクトレベルの権限パッケージによって処理されます。おそらくdjango-rulez。 – AgDude

答えて

4

デコレータuser_passes_testで表示をラップしてみませんか?あなたはそこに好きなチェックを実行することができます - ハックは必要ありません。

+0

user_passes_testは、ユーザーが読み取り専用アクセス権を持っている可能性があるため、私が望むものとはまったく同じではありません。たぶん、フォームを読み取り専用にすることができるデコレータを書くことができます。私はデコレータを読む必要があります。 – AgDude

+0

デコレータを読んでください。すべてのURLを繰り返し処理し、サルのパッチよりもすべてのビューを飾るハックは少なくなります(これは私が「ハックの少ない」ことについて話したときに考えていたものです)。しかし、最も説得力のあることは、私がデコレータを作ることを学ぶための即時の満足感を保証できるということです。あなたはデコレータを行うまで、あなたが経験したことのない優雅さをあなたのコードに与えます。 – jpic

+0

私を正しい方向に向けてくれてありがとう。私は、[ここ](http://blog.vmfarms.com/2010/01/helpful-django-view-decorator-pattern.html)に記載されている方法を使用して、私の基本的な考え方のいくつかを扱うつもりです。それは非常にDRYオプションのように思えます。 – AgDude

1

django-authorityまたはany authority packageを使用してください。しかし、私は彼らがハッキング自体に依存していることを保証することはできませんが、少なくともあなたはハッキングを使用していません。それは言った、ここにあなたの問題に対する実用的なソリューションです:=自己request.context設定する

  1. モンキーパッチdjango.template.base.RequestContext、。

  2. で設定にコンテキストプロセッサを追加し、あなたがここ

を行ってもいいですrequest.context

  • を使用することができますテンプレートのコンテキストプロセッサを作成あなたはsettings.pyに貼り付けることができます。

    def print_context(request): 
        print request.context.get('form', 'No form in this context') 
        return {} 
    
    from django.template.base import RequestContext 
    orig_init = RequestContext.__init__ 
    def new_init(self, request, **kwargs):           
        request.context = self 
        orig_init(self, request, **kwargs)           
    RequestContext.__init__ = new_init 
    
    TEMPLATE_CONTEXT_PROCESSORS = (
        'django.core.context_processors.auth',          
        'django.core.context_processors.debug', 
        'django.core.context_processors.i18n',          
        'django.core.context_processors.media', 
        'django.core.context_processors.request', 
        'settings.print_context', 
    ) 
    

    Djangoのデザインに対して作業していることに注意してください。私はあなたが何をしているかを前提としてこの答えを投稿しました。あなたはPythonとDjangoをよく知っています。

  • +0

    私はdjango-authorityをbitbucketでアクティブに見えなかったので無視しましたが、もう一度見てみましょう。私はあなたが言及したようなハッキングを使用して、むしろ一人ではないことに同意する。 – AgDude

    +0

    詳細な応答をありがとう。コンテキスト・プロセッサーがこれを処理する最善の方法ではないと私は確信しました。 – AgDude

    関連する問題