我怎样才能让某个模板只对 Django 中的确认用户可见?
How can i make a certain template visible only to confirmed users in Django?
我正在创建一个站点,并且我使用 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 %}
现在,我知道如何在理论上做到这一点,但实际上并不知道。我想我需要添加一个声明来检查电子邮件是否已确认。我不明白的是我应该在哪里添加这个声明以及它应该是什么样子。它应该在模板上吗?或者我应该为此创建一个视图吗?任何建议表示赞赏?提前致谢!
我认为最好将登录名放在 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 %}
如果您没有覆盖您的 User 模型,那么您可以将它放在一个单独的模型中,该模型与您的 User 模型具有 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 %}
第二个最佳选择是在视图中使用,但您需要在每个视图中放置相同的逻辑。如果您使用的是基于 Class 的视图,您可以创建一个 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-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 %}
现在,我知道如何在理论上做到这一点,但实际上并不知道。我想我需要添加一个声明来检查电子邮件是否已确认。我不明白的是我应该在哪里添加这个声明以及它应该是什么样子。它应该在模板上吗?或者我应该为此创建一个视图吗?任何建议表示赞赏?提前致谢!
我认为最好将登录名放在 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 %}
如果您没有覆盖您的 User 模型,那么您可以将它放在一个单独的模型中,该模型与您的 User 模型具有 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 %}
第二个最佳选择是在视图中使用,但您需要在每个视图中放置相同的逻辑。如果您使用的是基于 Class 的视图,您可以创建一个 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 %}