2017-03-28 5 views
0

現在、ユーザがアクセスできるのはviews.pyの機能があります。私はそれを一般にアクセス可能にするよう依頼されており、現在私の意見には@login_requiredデコレータを使用しています。提供されているオブジェクトに基づいて条件付きでこのデコレータを適用する方法はありますか?条件付きでDjangoでlogin_requiredデコレータを適用する

例えば、私のviews.pyの一部:

@login_required 
def details(request, object_id): 
    o = get_object_or_404(Model, pk=object_id) 

    if o.user_id == request.user.pk: 
     return render(request, 'app/details.html') 
    else: 
     return redirect('app:home') 
私が何をしたい

:もちろん

if not o.is_public: 
    @login_required 
def details(request, object_id): 
    o = get_object_or_404(Model, pk=object_id) 

    if o.user_id == request.user.pk: 
     return render(request, 'app/details.html') 
    else: 
     return redirect('app:home') 

、コードは動作しません(私)それが有効なPythonではありませんので(ii)まずオブジェクトを取得する必要があります。私はDjangoを使った洗練されたソリューションがあると信じています。これはWebアプリケーションでは非常に一般的な機能ですが、ドキュメントを無駄にしてしまいました。私は@login_requiredデコレータを別のデコレータで囲むべきだと思うが、私はあまりにもPythonのデコレータに慣れていない。どんな助けもありがとうございます。

+0

おそらくlogin_requiredデコレータを書き換える必要があります。機能だけでなく、別の外部パラメータ(この場合はo.is_public)も受け入れる必要があります。 o.is_publicがTrueの場合はログイン検証を行い、そうでない場合は渡します。 – Dan

+0

@Alasdairあなたが正しいです、私はミスタイプしたでしょう、それを修正します。私は 'それはo.is_public'ではないことを意味した –

答えて

0

この種の動作にはuser_passes_testを使用できます。

from django.contrib.auth.decorators import user_passes_test 

def public_check(user): 
    if user.is_public: 
     return True 

@user_passes_test(public_check) 
+0

しかし、それは公開する必要がありますユーザーではない、それはオブジェクトです。オブジェクト用の汎用デコレータはありますか? –

+0

さて、Modelオブジェクトは 'User'との関係です。この場合、' user.o'のような逆の関係で簡単にチェックできますか? –

+0

デコレータをドキュメントに従って書き直す必要があるようです。 –

0

デコレータが評価され、適用され、インポート時にと、あなたが言ってきたように、あなたは要求に基づいて最初のオブジェクトを取得する必要があるので、それはデコレータでは動作しません。

優雅なソリューションを求めているので、デコレータを作成して複数のビューで再利用できるようにしたいと思っているので、ソリューションはクラスベースのビューです。ビヘイビアをクラスベースのビューmixinとして実装することができます。これは、異なるクラスベースのビューに混在させることができます。この柔軟性の向上は、クラスベースのビューが導入された理由の1つです。

関連する問題