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

时间:2019-05-16 22:03:03

标签: django django-templates django-views django-urls django-allauth

我正在创建一个网站,并使用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 个答案:

答案 0 :(得分:2)

我认为最好将登录信息放入您的 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 %}