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
残念ながら私はクラスベースのビューを使用していません。ですから、私はテストをして各ビューの中でリダイレクトすることに制限されています。どこでこれを制限したいのですか? – curtisp
クラスベースのビューに切り替えることはかなり簡単です。利点は、それらがあなたのコードの "オブジェクトを取得する"側面を分離するのを助けることができるということです。プロパティからすべてのキーを取得したビューが12個ある場合、利用可能な 'get_queryset'メソッドまたは' get_object'メソッドに簡単にフックできます。 関数ベースのビューに本当に立ち往生している場合、オブジェクトルックアップをカプセル化するデコレータは悪くありません。 –
コメント編集と書式設定は難しいので、本体が 'def inner(request、id):return func(request、self.request.user.property_set.get(pk = id))'を返すデコレータの場合は –