在Django中注册不同类型的用户

时间:2016-10-04 06:47:42

标签: django django-views django-settings

我不需要编写很多代码,我只需要一个想法。我正在尝试将用户分为两个不同的类别。这是一个用户既可以有个人资料,也可以同时购买两者。

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)

我希望所有用户都拥有其中之一,他们将使用相同的表单进行注册,而无需在注册后再从一个表单切换到另一个表单。现在我正在做的是如果我不想要一个商店拥有的用户,以获得我所做的个人资料的优先权

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

但我必须为所有需要普遍存在的观点执行此操作。我想在网站范围内放置一些我可以放入设置或放在@login_required之类的视图。请问我该如何解决这个问题。谢谢

2 个答案:

答案 0 :(得分:1)

根据Prabhakar给出的答案,你应该使用django auth组。 但是,如果你想编写自定义权限类,你也可以这样做。

1)假设文件名 - > self_defined_permission.py

 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 self_defined_permission import ShopPermissions

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

3)如果您使用的是基于功能的视图。

    from rest_framework.decorators import permission_classes

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

答案 1 :(得分:0)

尝试user_passes_test装饰器:

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')