Django показывать сообщения при каждом просмотре - PullRequest
2 голосов
/ 03 февраля 2020

Я хочу показать сообщение при каждом просмотре в моем Django проекте. Как только пользователь создал учетную запись, я отправляю ему электронное письмо с просьбой подтвердить свою электронную почту, и пока он не подтвердит свой адрес электронной почты (посетив проверочный URL), я покажу сообщение.

Теперь я я не хочу показывать сообщение в представлении проверки URL, и я не хочу, чтобы сообщение "дублировалось", т.е. отображало два одинаковых сообщения. Сначала я попробовал подход создания промежуточного программного обеспечения, которое будет просто добавлять сообщение к каждому ответу, но у этого есть 2 недостатка:

  1. Сообщение появляется в представлении проверки - в настоящее время я удаляю все сообщения из этого представления , но это не идеально.
  2. Когда я использую перенаправление в своем представлении, я получаю более одного и того же сообщения. Большинство перенаправлений, которые я использую, выполняются после POST, поэтому я могу проверить, является ли запрос GET, но это не так.

Вот промежуточное ПО:

class VerifiedEmailMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        if request.user.id is None:
            return self.get_response(request)

        if not request.user.profile.verified_email:
            messages.warning(request, 'We have sent you an email to verify your account. '
                                      'Please click the link in that email to verify your account.')

        response = self.get_response(request)

        return response

Есть ли стандартный или лучший способ сделать это?

1 Ответ

1 голос
/ 03 февраля 2020

Этого можно добиться, просто создав контекстный процессор и проверив, подтвержден пользователь или нет. В соответствии с этим вы можете передать некоторый контекст вашему шаблону. Как:

def myContextProcessor(request):
    return {
       "is_loggedIn": True
    }

и зарегистрируйте его в settings.py

'context_processors': [
    ...,  
    'project.context_processors.myContextProcessor'
]
...