2012-03-26 22 views
8

Şu anda Django'nun dahili User için DetailView ürünüm var.Django'da Kullanıcılar Ayrıntı Görünümü Nasıl Yapılır?

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

Ama şablonda user eriştiklerinde, geçerli kullanıcı, ben DetailUser den geçmektedir pk ile değil kullanıcı giriş yapmış getirir. DetailUser'a user değişkenini başka bir şeye yeniden adlandırması gerektiğini söylemem gerekir mi? Ve eğer öyleyse, bunu nasıl yaparım?

cevap

12

django.contrib.auth.context_processors.auth, {{ user }} şablon bağlam değişkenini request.user veya AnonymousUser olarak ayarlar.

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

Sen setting context_object_name tarafından soruna geçici olabilir: Bu bir anda DetailView yarattığı {{ user }} bağlam değişken geçersiz kılar.

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 derin, get_context_object_name() belgelerine okuyun: Örneğin, bu DetailView kullanıcısı olarak ayarlanmış {{ user_object }} bağlam değişkeni sağlayacaktır.

+0

Bu konuda% 100 emin değilim, ancak diğer genel görünümler vardı ve değişken modelin adıdır. Örneğin, 'ListView' içinde' model = Poll' komutunu kullandıysam, değişken 'poll_list' olur. Aynı detayda 'DetailView',' poll' değişkeninin ismini verir. Belki bu Django v1.4 yeni bir şey mi? – hobbes3

+1

Haklısınız, yukarıdaki cevabı düzelttim. Geri bildiriminiz için teşekkür ederiz! – jpic

İlgili konular