2017-06-11 3 views
1

ビューのアクセスを許可するためにユーザーのカスタム属性をチェックするときに問題があります。Django CBV - ビューにアクセスできるようにユーザーのカスタム属性をチェックするにはどうすればいいですか?

私は、自分のuserprofileでself_storeオプションを有効にしたユーザーにアクセスを許可したいとします。

私は機能のビューを使用し、私はビューの最初にこれを入れて非常に簡単ですし、私は非常に使いやすいですし、活性化か異なるオプションのためのさまざまなことを行うとよく似細かい

if not request.user.is_authenticated(): 
    return redirect('auth_login') 

if not request.user.userprofile.self_store: 
    return do_something_here 

の作品私はこのupdateviewで私は、たとえば行うことができますどのようにusersprofileでself_storeオプションを有効にしているユーザーへのアクセスを許可したい場合は、私USERPROFILEに

しかし、私は、クラスベースのビューでこれを行うための方法を見つけるカント

class ClientUpdateView(UpdateView): 

model = Client 
template_name = "clients/update.html" 
pk_url_kwarg = 'client_id' 
fields = [ 
    'first_name', 
    'last_name', 
    'email', 
    'phone', 
    'phone_2', 
    'address', 
] 

私はlogginrequired mixinを使えますが、私はuserprofileで使用しているカスタムユーザーのプロパティを確認したいと思います。

私が作る必要があるチェックは、PermissionRequired Mixinのようなものですが、userprofileの属性です。

+1

は[ 'UserPassesTestMixin'](HTTPSを見てください.djangoproject.com/ja/1.11/topics/auth/default /#django.contrib.auth.mixins。UserPassesTestMixin) – Alasdair

+0

ありがとう!それは完璧に動作しますが、権限を持っていなければユーザーをリダイレクトできますが、一部のビューでは、ユーザーが認証されているかどうかを最初に確認し、ログインページに送信しない場合は認証します属性をアクティブにしているかどうかをチェックします(ホームに送信せずにメッセージを表示する場合)。あなたはCBVでこれを行うための何らかの方法を知っていますか?再度、感謝します! – marcosgue

+0

ユーザーがログインしているかどうかに応じて、 'get_login_url'メソッドをオーバーライドして別のURLを返すことができます。 – Alasdair

答えて

2

CBVでは、のself.requestとしてリクエストにアクセスできます。したがって、プロファイル属性をself.request.user.profile.attributeとして簡単に確認できます。要求引数プラス引数を受け付け、HTTPレスポンスを返すメソッド - CBVにおけるdispatch(request, *args, **kwargs)方法(説明を参照)

ビューのビューの一部もあります。 デフォルトの実装では、HTTPメソッドを検査し、HTTPメソッドに一致するメソッドに委任しようとします。 GETはget()、投稿するPOST()などに委任されます。

私の意見では、ディスパッチ方法でユーザーのアクセス許可を検証できます。たとえば、あなたが属性プロファイルによってユーザーを検証することができ、次のいずれか

def dispatch(self, request, *args, **kwargs): 
    """Return 403 if flag is not set in a user profile. """ 
    if not request.user.profile.has_flag: 
     return HttpResponseForbidden() 
    return super().dispatch(request, *args, **kwargs) 

やユーザー権限によって:

def dispatch(self, request, *args, **kwargs): 
    """Return 403 if user does not have specific permission. """ 
    if not request.user.has_perm('client_permission.client_edit'): 
     return HttpResponseForbidden() 
    return super().dispatch(request, *args, **kwargs) 

あなたがいない要求ユーザが、クライアント自体を検証したい場合は取得中にあなたがクライアントのアクセス許可を確認することができ対象:https://docs.djangoproject.com/en/1.11/ref/class-based-views/base/#django.views.generic.base.View.dispatch

from django.core.exceptions import PermissionDenied 
def get_object(self, *args, **kwargs): 
    client = super().get_object(*args, **kwargs) 
    if not client.profile.has_flag: 
     # The PermissionDenied exception is raised 
     # when a user does not have permission 
     # to perform the action requested. 
     raise PermissionDenied 
    return client 

あなたがここに発送方法についての詳細を読むことができます

Django Rest Frameworkを使用して権限をチェックするタスクがある場合は、permission_classes(http://www.django-rest-framework.org/api-guide/permissions/を参照)を使用することもできます。あなたがやるべきことはすべて、独自のパーミッションクラスを定義することです:

from rest_framework.permissions import BasePermission 
class UserHasFlag(BasePermission): 
    """Check that user has a flag set in a profile. """ 
    def has_permission(self, request, view): 
     return request.user.profile.has_flag 

あなたのビューは次のように見ていることでしょう://ドキュメント:

from rest_framework.permissions import IsAuthenticated 
class ClientUpdateView(UpdateView): 
    permission_classes = (IsAuthenticated, UserHasFlag) 
    model = Client 
    template_name = "clients/update.html" 
    pk_url_kwarg = 'client_id' 
    fields = [ 
     'first_name', 
     'last_name', 
     'email', 
     'phone', 
     'phone_2', 
     'address', 
    ] 
関連する問題