Как я могу сделать определенный шаблон видимым только для подтвержденных пользователей в Django? - PullRequest
0 голосов
/ 17 мая 2019

Я создаю сайт и успешно добавил систему подтверждения по электронной почте, используя 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 Ответ

2 голосов
/ 17 мая 2019

Я думаю, что лучше всего ввести логин в ваш 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, вы можете поместить ее в отдельную модель, которая имеет отношение OneToOne к вашей модели User:

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 %}

Второй лучший вариант - использовать в View, но вам нужно будет использовать одинаковую логику в каждом представлении.Если вы используете представление на основе классов, вы можете создать миксин и использовать его в них:

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 %} 
...