我正在使用 django.auth 中提供的登录名.html(默认在 templates/registration/login.html 中,对吗?这是登录.html:
<!-- templates/registration/login.html -->
{% extends 'base.html' %}
{% block title %}Login{% endblock %}
{% block content %}
<h2>Login</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Login</button>
</form>
{% endblock %}
请注意,我没有通知任何信息(例如user.username)传递到下一个URL。我将LOGIN_REDIRECT_URL更改为应用程序中的网址是:
app_name = 'ride'
urlpatterns = [
path('', views.home, name='home'),
]
再次注意 url 中没有。然后它将转到 views.py:
def home(request):
return render(request,'ride/home.html')
并且只有一个请求对象要传递给模板。这是 ride/home.html:
<!-- ride/templates/ride/home.html -->
{% extends 'ride/base.html' %}
{% block title %}HOmeeeeeeeeeee {% endblock %}
{% block content %}
{% if user.is_authenticated %}
Hi {{ user.username }}
{% else %}
<p>Welcome to CJ & XY's Ride Sharing Service!</p>
<a href="{% url 'login' %}">login</a> |
<a href="{% url 'login:signup' %}">signup</a>
{% endif %}
{% endblock %}
我在此模板中使用user.username 并且它完美显示。
所以我的问题是,这个最终模板如何知道哪个用户经过身份验证以及哪个用户的用户名?因为从一开始,我在重定向、url 和视图时没有传递用户的任何信息,例如 user.id 或其他东西。这太神奇了。
谁能给我钥匙?谢谢!
几个步骤。
当您登录时,Django 会将经过身份验证的用户的 ID 以及对其进行身份验证的后端存储在会话中。会话基本上是存储在数据库中的值字典,并通过存储在用户机器上的cookie中的ID与特定用户相关联。(请注意,Cookie 中的 ID 与用户的 ID 无关。
在每个请求中,身份验证中间件都会检查此 ID 并从数据库中获取相关用户,使其可用作request.user
。(事实上,这是懒惰地完成的,因此如果您不访问用户,数据库不会命中。
呈现模板时,身份验证上下文处理器从请求中获取用户,并将其作为user
变量在模板中可用;