Django 中自定义构建装饰器的条件设置问题

时间:2021-01-09 13:01:35

标签: python django

我正在尝试在 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 个条件

  1. user 处于活动状态并已登录
  2. is_Inspector 值为 True
  3. inspector_varified 的值也是 Trueinspector_varifiedInspector 类下)

我的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。我该如何编码?

1 个答案:

答案 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