Django:将 SESSION 值发送到可扩展的 html 模板

Django: send SESSION value to an extendable html template

一方面,我有一个 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/") 重定向到扩展 navbar.html 的 store.html。我想发送 request.session['user'] 到 navbar.html

当您呈现多个相互扩展的模板时,Django 会将它们视为一个合并页面。一个中可用的任何东西在另一个中也可用。如果您将会话信息传递给您的模板,它也会自动出现在您的导航栏中。您所要做的就是添加一些条件逻辑,以防止在没有会话信息的情况下打开导航栏时出现错误。

在您看来,您必须在上下文中包含会话信息。

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

并使用该上下文呈现模板

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

然后在您的模板中您可以自由访问 {{ session }}。要在您的导航栏中显示它并且不会弹出错误,只需添加一个 if 语句:

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

考虑一下,如果您要显示的所有信息都是关于当前登录用户的,您可能不需要执行任何这些操作。只需使用任何基于 class 的视图(我不确定基于函数的视图,因为我很少使用它们)并且在您的模板中,您始终可以引用 {{ user }} 及其所有属性,而无需手动传递它通过上下文变量传递给模板。

在某种程度上,DTL 中的登录用户是全球性的。

在这种情况下,您可以直接使用

#navbar.html
{% if user.is_authenticated %}
    <p>Hello, {{ user.first_name }} {{ user.last_name }}!</p>
{% else %}
    <p>Hello, guest!</p>
{% endif %}