我不需要编写很多代码,我只需要一个想法。我正在尝试将用户分为两个不同的类别。这是一个用户既可以有个人资料,也可以同时购买两者。
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
之类的视图。请问我该如何解决这个问题。谢谢
答案 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')