2016-10-04 9 views
0

コードを書く必要がなくなっています。アイデアが必要です。私は2つの異なるカテゴリでユーザーを作成しようとしています。ユーザーは、プロファイルまたはショップの両方。私は、すべてのユーザーが両方のいずれかを持っているのいずれかたいDjangoでさまざまなタイプのユーザーを登録する

class Profile(models.Model): 
    user=models.OneToOneField(User,on_delete=models.CASCADE,primary_key=True,editable=True) 

class Shop(models.Model): 
    user=models.OneToOneField(User,on_delete=models.CASCADE,primary_key=True,editable=True) 

、彼らは私がやっている彼らは今でit.Asのために登録した後、一方から他方へ切り替えることができることなく、同じフォームで登録しますです私は、プロファイルのprevilegeを持っているお店が所有するユーザーをたくない場合、私は

def post_product(request): 
    try: 
     if bool(request.user.profile)==False: 
      ..... 
    except: 
     pass 

を行うしかし、私はpreviledgesが必要なすべてのビューのためにこれをしなければなりません。私は私が設定して置くことができることをサイト全体の何かをしたいか、どのように私はおよそthis.Thanks

答えて

1

をPrabhakar、あなたはdjangoの認証グループを使うべきです。 ただし、カスタムアクセス許可クラスを作成する場合は、それを行うこともできます。

1)と仮定すると、ファイル名 - > self_defined_permission.pyあなたは機能ベースのビューを使用している場合は、あなたのクラスベースのビュー

 from self_defined_permission import ShopPermissions 

    class SomeView(generics.ListCreateAPIView): 
     ... 
     permission_classes = (ShopPermissions,) 

3)では

from rest_framework import permissions 
from django.contrib.auth.models import Group 

class ShopPermissions(permissions.BasePermission): 
    def has_object_permission(self, request, view, obj): 
     ''' 
     check user group. Assuming you keep users having profile in group 1 and shop in group 2 
     ''' 
     shop_gp = Group.objects.get(id=2) 
     if shop_gp in request.user.groups.all(): 
      return True 
     else: 
      return False 
     ''' 
      similarly you could write permission class for profile owners 
     ''' 

2)。

from rest_framework.decorators import permission_classes 

    @permission_classes((ShopPermissions,)) 
    def some_view(request): 
     .... 
0

user_passes_testデコレータを試しに行くことができ@login_requiredしなさいのようなビューに置か:によって与えられた答えを1として

from django.contrib.auth.decorators import user_passes_test 

def is_shop(user): 
    return Shop.objects.filter(user=user).exists() 

def is_normal_user(user): 
    return Profile.objects.filter(user=user).exists() 

@user_passes_test(is_shop) 
def only_for_shops(request): 
    return render(request, 'edit_price_list.html') 
関連する問題