С одной стороны, у меня есть шаблон navbar.html, который можно расширить несколькими другими шаблонами html. С другой стороны, в моих представлениях у меня есть система входа в систему, и когда пользователь входит в систему, я создаю значение сеанса с именем пользователя. Я хочу отправить это значение сеанса в html навигационной панели, но без рендеринга этого шаблона. Как я мог это сделать?

Войти в view.py

name = form.cleaned_data.get('name')
password = form.cleaned_data.get('password')
user = Users.objects.filter(name=name, password=password)

if user.count() > 0:
    request.session['user'] = user.name

    return redirect("store/")

else:
    messages.info(request, 'Invalid credentials')
    return redirect("/login/")

return redirect("store/") перенаправляет на store.html, который расширяет navbar.html. Я хочу отправить request.session['user'] в navbar.html

2
sirihe 2 Дек 2020 в 13:47

1 ответ

Лучший ответ

Когда вы визуализируете несколько расширенных друг в друга шаблонов, Django рассматривает их как одну объединенную страницу. Все, что доступно в одном, доступно и в другом. Если вы передадите информацию о сеансе в свой шаблон, она также автоматически станет доступной на вашей панели навигации. Все, что вам нужно сделать, это добавить некоторую условную логику, чтобы панель навигации не выдавала ошибку, когда вы открываете ее без информации о сеансе.

На ваш взгляд, вы должны включить информацию о сеансе в контекст.

#view
context['session'] = request.session

И отобразить шаблон с этим контекстом

#view
return render(request, "template.html", context)

Тогда в вашем шаблоне вы сможете свободно получить доступ к {{ session }}. Чтобы отобразить его на панели навигации и не отображать ошибки, просто добавьте оператор if:

#navbar.html    
{% if session %} Welcome back {{ session.user }} {% endif %}

Учтите, что если вся информация, которую вы хотите отобразить, касается текущего пользователя, вошедшего в систему, вам, вероятно, не нужно ничего делать из этого. Просто используйте любое представление на основе классов (я не уверен насчет представлений на основе функций, поскольку я редко использую их), и в своих шаблонах вы всегда можете ссылаться на {{ user }} и все его атрибуты без необходимости вручную передавать его в шаблон через переменную контекста.

В некотором смысле зарегистрированный пользователь в DTL является глобальным.

В этом случае вы можете просто пойти с

#navbar.html
{% if user.is_authenticated %}
    <p>Hello, {{ user.first_name }} {{ user.last_name }}!</p>
{% else %}
    <p>Hello, guest!</p>
{% endif %}
2
Beikeni 2 Дек 2020 в 11:03