我正在尝试在 Django 中创建一个自定义构建装饰器。
我的models.py
:
class myCustomeUser(AbstractUser):
id = models.AutoField(primary_key=True)
username = models.CharField(max_length=20, unique="True", blank=False)
password = models.CharField(max_length=20, blank=False)
is_Inspector = models.BooleanField(default=False)
is_Industry = models.BooleanField(default=False)
is_Admin = models.BooleanField(default=False)
def __str__(self):
return self.username
class Inspector(models.Model):
user = models.ForeignKey(myCustomeUser, on_delete=models.CASCADE, related_name='inspector_releted_user')
name = models.CharField(max_length=200, blank=False, null=True)
gmail = models.EmailField(null=True, blank=False, unique=True)
nid = models.IntegerField(blank=False, unique=True)
inspector_varified = models.BooleanField(default=False, blank=True, null=True)
def __str__(self):
return self.name
现在我想构建一个装饰器,允许用户通过满足以下 3 个条件:
user
处于活动状态并已登录is_Inspector
值为 Trueinspector_varified
的值也是 True
(inspector_varified
在 Inspector
类下)我的decorators.py
:
def inspector_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url='app2:request_login'):
actual_decorator = user_passes_test(
lambda u: u.is_active and u.is_Inspector,
login_url=login_url,
redirect_field_name=redirect_field_name
)
if function:
return actual_decorator(function)
return actual_decorator
它正在维持条件 1 和 2,但它不满足条件 3。我该如何编码?
答案 0 :(得分:1)
建模本身没有多大意义:通过使用 ForeignKey
,一个 User
可以拥有 多个 Inspector
对象,因此没有单个 { {1}}。这可能不是您想要的建模方式。
您可以将 Inspector
转换为 OneToOneField
[Django-doc],这本质上是具有唯一性约束的 ForeignKey
,这意味着每个 ForeignKey
将引用一个 < em>不同的用户。
Inspector
然后我们可以检查:
class Inspector(models.Model):
user = models.OneToOneField(
myCustomeUser,
on_delete=models.CASCADE,
related_name='inspector_releted_user'
)
# …
然后我们可以验证这一点:
def check(user):
try:
return user.is_authenticated and user.is_Inspector and user.inspector_related_user.inspector_varified
except AttributeError:
return False
然而,建模看起来仍然不是很好,特别是因为 def inspector_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url='app2:request_login'):
actual_decorator = user_passes_test(
check,
login_url=login_url,
redirect_field_name=redirect_field_name
)
if function:
return actual_decorator(function)
return actual_decorator
确实不需要需要是用户模型的一个字段:我们可以简单地检查 is_Inspector
是检查器,通过检查是否存在指向该用户的 User
对象。
此外,字段名称以 snake_case 格式书写,因此 Inspector
,而不是 。is_inspector