【问题标题】:How to do a DetailView of Users in Django?如何在 Django 中进行用户的 DetailView?
【发布时间】:2012-04-09 16:15:02
【问题描述】:

我目前有一个 DetailView 用于 Django 的内置 User

url(
    r'^users/(?P<pk>\d+)/$',
    DetailView.as_view(
        model = User,
        template_name = 'doors/users/detail.html'
    ),
    name = 'users_detail'
)

但是当我在模板中访问user 时,它会显示当前登录 用户,而不是我从DetailUser 传递的具有pk 的用户。我是否需要告诉DetailUseruser 变量重命名为其他名称?如果是这样,我该怎么做?

【问题讨论】:

    标签: python django django-templates django-urls


    【解决方案1】:

    django.contrib.auth.context_processors.auth 将 {{ user }} 模板上下文变量设置为 request.user 或 AnonymousUser。因此,它会覆盖您的 DetailView 创建的 {{ user }} 上下文变量:

    def auth(request):
        """
        Returns context variables required by apps that use Django's authentication
        system.
    
        If there is no 'user' attribute in the request, uses AnonymousUser (from
        django.contrib.auth).
        """
        # If we access request.user, request.session is accessed, which results in
        # 'Vary: Cookie' being sent in every request that uses this context
        # processor, which can easily be every request on a site if
        # TEMPLATE_CONTEXT_PROCESSORS has this context processor added.  This kills
        # the ability to cache.  So, we carefully ensure these attributes are lazy.
        # We don't use django.utils.functional.lazy() for User, because that
        # requires knowing the class of the object we want to proxy, which could
        # break with custom auth backends.  LazyObject is a less complete but more
        # flexible solution that is a good enough wrapper for 'User'.
        def get_user():
            if hasattr(request, 'user'):
                return request.user
            else:
                from django.contrib.auth.models import AnonymousUser
                return AnonymousUser()
    
        return {
            'user': SimpleLazyObject(get_user),
            'messages': messages.get_messages(request),
            'perms':  lazy(lambda: PermWrapper(get_user()), PermWrapper)(),
        }  
    

    您可以通过setting context_object_name 解决此问题。例如,这将启用 {{ user_object }} 上下文变量,设置为 DetailView 的用户:

    url(
        r'^users/(?P<pk>\d+)/$',
        DetailView.as_view(
            model = User,
            template_name = 'doors/users/detail.html',
            context_object_name = 'user_object'
        ),
        name = 'users_detail'
    )
    

    深入挖掘,阅读get_context_object_name() 的文档。

    【讨论】:

    • 对此我不是 100% 确定,但我有其他通用视图,变量是模型的名称。例如,如果我在ListView 中执行了model = Poll,则变量变为poll_listDetailView 中的相同变量名称为 poll。也许这是 Django v1.4 中的新功能?
    • 你是对的,我修正了上面的答案。感谢您的反馈!
    猜你喜欢
    • 2015-06-08
    • 1970-01-01
    • 2012-01-04
    • 2021-03-17
    • 2011-08-25
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 2018-02-26
    相关资源
    最近更新 更多