【问题标题】:Django User's DetailVew affects authenticated UserDjango 用户详细信息视图影响经过身份验证的用户
【发布时间】:2019-06-20 01:17:02
【问题描述】:

我尝试使用 DetailView 显示有关用户(个人资料页面)的信息。它可以工作,但是当我出于某种原因打开用户的 DetailView 时,Django 认为我已通过此用户身份验证。举个例子,如果我注销,打开一些用户的 DetailView,Django 开始认为我是作为这个用户登录的。我可以看到问题,因为 base.html 显示当前登录的用户,如果用户未通过身份验证,则会发生更改。有什么想法有什么问题吗?谢谢!

views.py

class ProfileView(DetailView):
    model = User
    template_name = 'users/profile.html'

urls.py

urlpatterns = [
    path('profile/<int:pk>/<str:username>', ProfileView.as_view(), name='profile'),
]

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 %}

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>
...

【问题讨论】:

    标签: django detailview


    【解决方案1】:

    其实用户没有登录,是你的代码有问题。当您使用上下文参数user 将User 数据发送到模板时,它会与request.user 混淆。有趣的是,如果您尝试使用该用户(从 DetailView 发送),它将显示 is_authenticated true,因此您将在基于 html 中看到登录用户。例如:

    user = User.objects.first()
    user.is_authenticated()  # It will return True
    

    为防止这种情况,您需要为 DetailView 发送不同的上下文参数。喜欢:

    class ProfileView(DetailView):
        context_object_name = "profile_user"
        ...
    

    在模板中,使用profile_user。此外,如果您只希望登录用户访问该特定视图,那么您应该从LoginRequiredMixin 对其进行子类化。例如:

    from django.contrib.auth.mixins import LoginRequiredMixin
    
    class ProfileView(LoginRequiredMixin, DetailView):
       ...
    

    【讨论】:

    • 将profile_user 用作新的context_object_name 并在DetaiView 中使用它对我不起作用。对于所有用户,我仍然将profile_user.is_authenticated 视为True...
    • 你必须在模板中使用user.is_authenticated。
    • 我做到了,我仍然可以看到所有用户的True...我在codeshare.io/axDBWR 上传了我的代码的相关部分,以防您想快速查看它。也许我错过了一些东西。感谢您宝贵的时间:)
    • 您可以尝试注销然后再次访问该网址吗?
    • 还是一样,即使在隐身窗口中:(我为你录制了这个视频:streamable.com/a2q5mn
    猜你喜欢
    • 2020-09-11
    • 1970-01-01
    • 2011-05-23
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多