Как использовать фреймворк сообщений django для ввода логина, необходимого для отображения сообщения

Я использую декоратор @login required в большинстве моих представлений, так что я хочу использовать сообщение на странице входа, говорящее пользователю, что если вы хотите открыть эту страницу, вы должны сначала войти, так что как я могу достичь этого, я знаю, что не могу достичь этого на моих представлениях, так что любой делает это и знает, как сделать, пожалуйста, скажите мне, как достичь этого, если пользователь перенаправляется на вход из-за @login required, я хочу показать сообщение Please login to continue

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

На основании этого сообщения Stack Overflow, используя несколько ответов, для перенаправления на другую страницу, либо:

Задайте LOGIN_URL в settings.py. Это URL, на который Django будет перенаправлять, если пользователь, который еще не вошел в систему, попытается войти.

или Inline:

from django.contrib.auth.decorators import login_required

@login_required(login_url='/example url you want redirect/') #redirect when user is not logged in
def myview(request):
    do something
    return something #returns when user is logged in

Конечно, вам все еще нужно настроить представление входа в систему.

Если вы хотите проверить, аутентифицирован ли пользователь в HTML, вы можете использовать систему шаблонов: (Для ясности это то, что я только что создал, это не из сообщения Stack Overflow, упомянутого выше)

{% if user.is_authenticated %}
// Display something if authenticated maybe
{% else %}
// Display something like "You are not logged in etc"
{% endif %}

Решение 1:

В вашем представлении проверьте параметр запроса "next", так как если пользователь перенаправляется на представление входа в систему, то в URL он будет сопровождаться ?next=/whatever. Вы можете сделать

if 'next' in request.GET:
    messages.add_message(request, messages.INFO, 'Hello world.')

Решение 2 (не рекомендуется, это делает отладку запутанной для других):

Python является динамическим языком, вы можете изменить поведение login_required с помощью своей версии.

в ваших manage.py и wsgi.py и, возможно, asgi.py вам потребуется "обезьяний патч" декоратора login_required.

from django.contrib.auth import decorators

def my_login_required(...):
    # you can look at the implementation in the answer by LvanderRee mentioned in the comments

decorators.login_required = my_login_required

Теперь, поскольку эти файлы будут первым кодом, который будет выполняться еще до запуска Django, это заменит встроенный login_required на вашу версию.

Вернуться на верх