2016-09-11 25 views
0

Djangoのuser_passes_test()はビューのパラメータにアクセスできますか?Djangoのカスタムデコレータuser_passes_test()でURLパラメータを取得できますか?

def property(request, id): 
    property = Property.objects.get(id=int(id)) 

レコードがもともとレコードを作成したユーザーのIDを含むフィールドという名前のuser_idがあります。たとえば

私は特定のレコードを取得するためにidを受け景色を眺めることができます。私は、ユーザーがリダイレクトされなければ自分のレコードだけを見ることができるようにしたい。

シンプルでクリーンなカスタムデコレータを使用したいと思います。

カスタムデコレータの場合、これはうまくいくでしょうか?私は、プロパティのレコードに現在のユーザーを比較するロジックを含むようにuser_is_property_ownerという名前の別のtest_funcを作成しようとした

@user_passes_test(request.user.id = Property.objects.get(id=int(id)).id, login_url='/index/') 
def property(request, id): 
    property = Property.objects.get(id=int(id)) 

@user_passes_test(user_is_property_owner(id), login_url='/index/') 
def property(request, id): 
    property = Property.objects.get(id=int(id)) 


def user_is_property_owner(property_id): 
    is_owner = False 
    try: 
     Property.objects.filter(id=property_id, user_id=user_id).exists() 
     is_owner = True 
    except Property.DoesNotExist: 
     pass 

しかしuser_is_property_ownerへの要求から、トラブル、現在のユーザIDを取得し、プロパティIDを有するUSER_IDデコレータ機能。


EDITを使用していたソリューションを追加します。私は各視野の中でテストをしましたが、テストが必要でした。それは単純だ。私はデコレータを使う方がきれいで、少しシンプルかもしれないと思っていました。通常

def property(request, id): 

    # get object 
    property = Property.objects.get(id=int(id)) 

    # test if request user is not user id on property record  
    if request.user.id != property.user_id: 
     # user is not same as property user id so redirect to index 
     return redirect('index') 

    # rest of the code if request user is user_id on property record 
    # eg it is ok to let user into view 

答えて

1

、(クラスベースのビューを使用して)それは

class PropertyDetail(DetailView): 
    def get_queryset(self): 
     return self.request.user.property_set.all() 

ようなものになるだろうとプロパティがない場合には、404を与えるので、私はget_queryset方法でこれを処理します現在のユーザーのPropertyより多くの権限関係で結ばれる場合は、django-guardianのようなプロジェクトを使用することをお勧めします。

あなたはUserPassesTestMixinで見てみる場合は、それはあなたがそのルートを行くことにした場合ので、あなたはself.get_object(request)を自分で呼び出す必要がありますdispatchを呼び出す前test_funcを処理していることがわかります。

+0

残念ながら私はクラスベースのビューを使用していません。ですから、私はテストをして各ビューの中でリダイレクトすることに制限されています。どこでこれを制限したいのですか? – curtisp

+0

クラスベースのビューに切り替えることはかなり簡単です。利点は、それらがあなたのコードの "オブジェクトを取得する"側面を分離するのを助けることができるということです。プロパティからすべてのキーを取得したビューが12個ある場合、利用可能な 'get_queryset'メソッドまたは' get_object'メソッドに簡単にフックできます。 関数ベースのビューに本当に立ち往生している場合、オブジェクトルックアップをカプセル化するデコレータは悪くありません。 –

+0

コメント編集と書式設定は難しいので、本体が 'def inner(request、id):return func(request、self.request.user.property_set.get(pk = id))'を返すデコレータの場合は –

関連する問題