我的项目中有两个模型。两者都引用了User类(我使用User模型来访问authenticate和login_required等方法)
class Customer(models.Model):
Customer = models.OneToOneField(User)
CustomerID = models.CharField(max_length = 15)
phone_regex = RegexValidator(regex = r'\d{10}', message = 'Enter your 10 digit Mobile number')
Phone_no = models.CharField(max_length = 10,validators = [phone_regex],blank = True)
Customer_wallet = models.IntegerField(default = 100)
class Merchants(models.Model):
merchant = models.OneToOneField(User)
MerchantID = models.CharField(max_length = 15)
Storename = models.CharField(max_length = 25)
目前,任何用户(无论他是商家还是客户)都可以访问整个网站。我如何使用什么来限制客户/客户网址和商家到/商家网址?
def check_if_merchant(user):
try:
user.__getattribute__('merchants')
except AttributeError:
return False
我尝试了user_passes_test装饰器来检查用户是否有商家或客户属性。但它似乎会自动重定向到/ accounts / Merchants等,这些都没有在urls.py中设置。
答案 0 :(得分:3)
user_passes_test
只是一个简单的装饰器,是的, 重定向到登录网址。
现在,由于user_passes_test
会调用您自己的测试函数,如果您想要返回403 Forbidden
,则只需要引发PermissionDenied
而不是返回False
:
from django.core.exceptions import PermissionDenied, ObjectDoesNotExist
def check_if_merchant(user):
try:
user.merchants
except (AttributeError, ObjectDoesNotExist):
raise PermissionDenied
else:
return True
或者,您可以先检查您是否有登录用户,如果没有,则返回False,将未登录的用户重定向到登录页面:
from django.core.exceptions import PermissionDenied, ObjectDoesNotExist
def check_if_merchant(user):
if user.is_anonymous():
return False
try:
user.merchants
except (AttributeError, ObjectDoesNotExist):
raise PermissionDenied
else:
return True