我试图使用DetailView显示有关用户(配置文件页面)的信息。它可以工作,但是当我出于某种原因打开User的DetailView时,Django认为我已通过此用户身份验证。例如,如果我注销,请打开一些用户的DetailView,Django开始认为我是以该用户身份登录的。我可以看到问题,因为base.html显示了当前登录的用户,如果用户未通过身份验证,则会进行更改。任何想法有什么问题吗?谢谢!
views.py
class ProfileView(DetailView):
model = User
template_name = 'users/profile.html'
Run Code Online (Sandbox Code Playgroud)
urls.py
urlpatterns = [
path('profile/<int:pk>/<str:username>', ProfileView.as_view(), name='profile'),
]
Run Code Online (Sandbox Code Playgroud)
profile.html
{% extends 'base.html' %}
{% block content %}
<article class = 'media content-section'>
<div class="media">
<img class="avatar-image rounded-circle" src="{{ user.profile.image.url }}">
</div>
<div class = 'media-body'>
<div class='article-metadata'>
<h3>??????? {{user.username}}</h3>
</div>
<div class="article-content">
<p>{{user.first_name}}</p>
<p>{{user.email}}</p>
<p>{{user.profile.birthdate}}</p>
<p>{{user.date_joined}}</p>
</div>
</div>
</article>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
base.html
<div class="navbar-nav">
{% if user.is_authenticated %}
<div class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="far fa-user-circle" title="????????????"> {{user.username}}</i></a>
...
Run Code Online (Sandbox Code Playgroud)
实际上,用户未登录,但是您的代码有问题。当您User使用上下文参数将数据发送到模板时user,它会与混合在一起request.user。有趣的是,如果尝试使用该用户(从DetailView发送),它将显示is_authenticated true,因此您将看到基于html的登录用户。例如:
user = User.objects.first()
user.is_authenticated() # It will return True
Run Code Online (Sandbox Code Playgroud)
为防止这种情况,您需要为DetailView发送一个不同的上下文参数。喜欢:
class ProfileView(DetailView):
context_object_name = "profile_user"
...
Run Code Online (Sandbox Code Playgroud)
并在模板中使用profile_user。另外,如果只希望登录用户访问该特定View,则应从LoginRequiredMixin对其进行子类化。例如:
from django.contrib.auth.mixins import LoginRequiredMixin
class ProfileView(LoginRequiredMixin, DetailView):
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
53 次 |
| 最近记录: |