如何使某个模板仅对 Django 中已确认的用户可见?

Posted

技术标签:

【中文标题】如何使某个模板仅对 Django 中已确认的用户可见?【英文标题】:How can i make a certain template visible only to confirmed users in Django? 【发布时间】:2019-10-04 05:44:12 【问题描述】:

我正在创建一个站点,并使用django-allauth 成功添加了一个电子邮件确认系统。现在我想让我的网站的某些部分只对确认电子邮件的用户开放。

假设该部分看起来像这样:

% extends "main/header.html" %
% if user.is_authenticated %
% block content %


<body>



<div>
    <p> Here are are a bunch of features etc... </p>
</div>          



</body>

% endblock %
% endif %

现在,我理论上知道如何做到这一点,但实际上并不知道。我想我需要添加一个声明来检查电子邮件是否得到确认。我不明白的是我应该在哪里添加这个语句以及它应该是什么样子。它应该在模板上吗?或者我应该为此创建一个视图?任何建议表示赞赏?提前致谢!

【问题讨论】:

【参考方案1】:

我认为最好将登录信息放入您的 CustomUser Model

class CustomUser(AbstractUser):

    @property
    def has_verified_email(self):
        return self.emailaddress_set.filter(verified=True,primary=True).exists()

然后在模板中使用:

 % if user.has_verified_email %
    // some lines 
 % endif %

如果您没有覆盖您的用户模型,那么您可以将它放在一个单独的模型中,该模型与您的用户模型具有 OneToOne 关系:

class Profile(models.Model):
        user = models.OneToOneField(User)

        @property
        def has_verified_email(self):
            return self.user.emailaddress_set.filter(verified=True,primary=True).exists()

然后在模板中使用:

 % if user.profile.has_verified_email %
    // some lines 
 % endif %

第二个最佳选择是在视图中使用,但您需要在每个视图中放置相同的逻辑。如果您使用的是基于类的视图,您可以制作一个 Mixin 并在其中使用它:

class SomeMixin(object):
     def get_context_data(self, *args, **kwargs):
         context = super(SomeMixin, self).get_context_data(*args, **kwargs)
         context['has_verified_email'] = self.request.user.emailaddress_set.filter(verified=True,primary=True).exists()
         return context

class ActualView(SomeMixin, TemplateView):
     # subclassing from the mixin in

// template code
 % if has_verified_email %
    // some lines 
 % endif % 

【讨论】:

以上是关于如何使某个模板仅对 Django 中已确认的用户可见?的主要内容,如果未能解决你的问题,请参考以下文章

如何使 django 中的 FileField 成为可选的?

如何使 django 中的 FileField 成为可选的?

用户定义的模板Django

如何使登录表单在 Django 的整个站点上可用

Django基础自测

Django视图绕过渲染请求