2012-03-26 3 views
8

Attualmente ho uno DetailView per il User integrato di Django.Come fare un DetailView di utenti in Django?

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

Ma quando accedo user nel modello, che porta in primo piano la corrente loggato utente, non l'utente con il pk che passo da DetailUser. Devo dire allo DetailUser di rinominare la variabile user in qualcos'altro? E se sì, come faccio?

risposta

12

django.contrib.auth.context_processors.auth imposta la variabile di contesto del modello {{ user }} su request.user o AnonymousUser. Quindi, si sovrascrive la variabile {{ user }} contesto creato da tuo 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)(), 
    } 

è possibile aggirare il problema setting context_object_name. Ad esempio, ciò consentirà la variabile {{ user_object }} contesto, impostare l'utente del 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 profondo, leggere la documentazione per get_context_object_name().

+0

Non sono sicuro al 100%, ma ho avuto altre viste generiche e la variabile è il nome del modello. Ad esempio, se ho fatto 'model = Poll' in un' ListView', la variabile diventa 'lista_risposta '. Lo stesso in un 'DetailView' dà un nome variabile di' poll'. Forse questo è qualcosa di nuovo in Django v1.4? – hobbes3

+1

Sei corretto, ho corretto la risposta di cui sopra. Grazie per il tuo feedback ! – jpic