Django 用户视图影响 current_user

问题描述 投票:0回答:1

我有用于查看有关特定用户的所有信息的网址:

blog/urls.py(我使用'urlpatterns +='来给出一段urlpatterns列表,它不在我的文件中)

urlpatterns += path('user/<int:pk>/', UserDetailView.as_view(), name='user-detail'),

使用此 UserDetailView 视图:

博客/views.py

class UserDetailView(DetailView):
    model = User
    template_name = 'blog/user_detail.html'

继承自DetailView并使用Django的User模型。

我在基本 html 文件中有导航栏,显示当前用户昵称,并附有其页面的链接:

base.html(所有其他 html 文件继承自)

{% if user.is_authenticated %}
                        <a class="nav-item nav-link" href="{% url 'post-create' %}">New Post</a>
                        <a class="nav-item nav-link" href="{% url 'user-detail' user.id %}">{{ user.username }}</a>
                        <a class="nav-item nav-link" href="{% url 'logout-page' %}">Logout</a>

现在,当我登录并查看除

'user/<int:pk>/'
之外的任何页面时,带有链接的昵称会按预期显示,但是当我查看某个特定用户的页面时, {{ user ]} 从当前用户更改为用户页面我正在看:图像

带有 Post 模型的 ListView 通过昵称调用 User 不会影响当前用户:

博客/urls.py

urlpatterns += path('user/<str:username>', UserPostListView.as_view(), name='user-posts')

博客/views.py

class UserPostListView(ListView):
    model = Post
    template_name = 'blog/user_posts.html'   # <app>/<model>_<viewtype>.html    # blog/post_list.html
    context_object_name = 'posts'
    paginate_by = 2

    def get_queryset(self):
        user = get_object_or_404(User, username=self.kwargs.get('username'))
        return Post.objects.filter(author=user).order_by('-date_posted')


UserPostListView.

如果规范不够,这里是 git

有没有办法阻止带有 User 模型的 DetailView 将 {{ user }} 从当前用户更改为我正在查看的页面?

python-3.x django django-views django-users
1个回答
0
投票

有没有办法阻止

DetailView
用户模型将 {{ user }} 从当前用户更改为我正在查看的页面?

发生这种情况的原因是因为 Django 在模板中将对象注入为

object
,同时也作为
.get_context_object_name(…)
 [Django-doc]
的结果,默认情况下是模型的名称小写,所以在这种情况下
user

但是我们可以通过

{{ request.user }}
来获取登录用户:

{{ request.user }}  # 🖘 logged-in user
{{ user }}          # 🖘 object of the DetailView
{{ object }}        # 🖘 object of the DetailView

另一个选项是指定不同的

context_object_name
,例如:

class UserDetailView(DetailView):
    model = User
    template_name = 'blog/user_detail.html'
    context_object_name = 'the_user'

然后我们合作:

{{ request.user }}  # 🖘 logged-in user
{{ user }}          # 🖘 logged-in user
{{ the_user }}      # 🖘 object of the DetailView
{{ object }}        # 🖘 object of the DetailView

注意:通常使用

settings.AUTH_USER_MODEL
 [Django-doc] 来引用用户模型比使用
User
模型 [Django- doc]
直接。有关更多信息,您可以参阅文档的引用
User
模型
部分[Django-doc]

© www.soinside.com 2019 - 2024. All rights reserved.