2012-03-26 25 views
8

Actualmente tengo un DetailView para el User incorporado de Django.¿Cómo hacer un DetailView de usuarios en Django?

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

Pero cuando accedo a user en la plantilla, que trae la corriente registran en usuario, no al usuario la pk que pasan de DetailUser. ¿Debo decirle al DetailUser que cambie el nombre de la variable user a otra cosa? Y si es así, ¿cómo hago eso?

Respuesta

12

django.contrib.auth.context_processors.auth establece la variable de contexto de plantilla {{ user }} en request.user o AnonymousUser. Por lo tanto, se anula la variable {{ user }} contexto creado por el DetailView:

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)(), 
    } 

puede solucionar el problema por setting context_object_name. Por ejemplo, esto permitirá que la variable {{ user_object }} contexto, se establece en el usuario de la 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' 
) 

Dig más profundo, leer la documentación de get_context_object_name().

+0

No estoy 100% seguro de esto, pero tenía otras vistas genéricas, y la variable es el nombre del modelo. Por ejemplo, si hice 'model = Poll' en un' ListView', entonces la variable se convierte en 'poll_list'. Lo mismo en un 'DetailView' da un nombre de variable de' poll'. Tal vez esto es algo nuevo en Django v1.4? – hobbes3

+1

Tiene razón, he reparado la respuesta anterior. Gracias por tus comentarios ! – jpic

Cuestiones relacionadas