Я создаю сайт и успешно добавил систему подтверждения по электронной почте, используя Джанго-Аллаут. Теперь я хотел бы, чтобы некоторые части моего сайта были доступны только пользователям, подтвердившим свою электронную почту.
Предположим, что эта часть выглядит примерно так:
{% 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 %}
Если вы не переопределили свою модель пользователя, вы можете поместить ее в отдельную модель, которая имеет отношение 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 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 %}