用于UserProfile allauth的Django @decorator

时间:2014-03-15 05:43:58

标签: python django decorator django-allauth

我目前正在使用allauth软件包,该软件包扩展了用户模型,以包含像我这样的其他字段。我想知道是否有任何类似于登录的方法,我可以使用@decorator来检查User.profile。代码如下所示,我认为这比我能解释得更好。

我正在尝试@user_passes_test(lambda u: u.profile.account_verified)总是返回<bound method UserProfile.account_verified of <UserProfile>>

型号:

class UserProfile(models.Model):
  user = models.OneToOneField(User, related_name='profile')
  about_me = models.TextField(null=True, blank=True)

  def account_verified(self):
      """
      If the user is logged in and has verified hisser email address, return True,
      otherwise return False
      """
      if self.user.is_authenticated:
          result = EmailAddress.objects.filter(email=self.user.email)
          if len(result):
              return result[0].verified
      return False

查看:

@user_passes_test(lambda u: u.profile.account_verified)
def index(request):
  //logic in here

1 个答案:

答案 0 :(得分:1)

返回绑定方法应该是一个巨大的提示:它是一个方法,而不是一个值。您通常会调用方法来使其完成工作,因此您缺少的是调用它。

@user_passes_test(lambda u: u.profile.account_verified)

如果lambda函数返回一个true的bool(function_result),则该测试通过:对于方法,它始终为真。

你想要的是调用方法并让它返回真或假

@user_passes_test(lambda u: u.profile.account_verified())

或者,如果您希望该方法成为属性,请使用@property

修饰方法
  @property
  def account_verified(self):

现在它是一个属性,你不需要打电话。