Django的get_context_data函数不起作用?

时间:2013-07-27 06:35:44

标签: python django django-class-based-views

我正在练习Django的基于类的视图。

似乎我的重写get_context_data函数无法正常工作,但我不知道出了什么问题:(

我的代码:

urls.py

url(r'^user/(?P<pk>\d+)/posts/$', UserPosts.as_view(), name='user_post'),

views.py

class UserPosts(ListView):
    template_name = 'app_blog/user_posts_page.html'
    context_object_name = 'post_list'

    def get_queryset(self):
        self.user = get_object_or_404(User, id=self.kwargs['pk'])
        return self.user.post_set.order_by('-id')
    def get_context_data(self, **kwargs):   
        context = super(UserPosts, self).get_context_data(**kwargs)
        context['user'] = self.user
        return context

user_post_page.html

{% block content %}
    <div class="main_content">
        <h2>Welcome to {{user.username}}'s User Post Page!</he>
        <ul>
        {% for post in post_list %}
            <li><a href="/blog/post/{{post.id}}/">{{post.post_title}}</a></li>
        {% endfor %}
        </ul>
    </div>
{% endblock %}

html页面正确显示用户的post_list,但h2标签显示:

Welcome to 's User Post Page!

我很确定我在get_context_data函数中传递了'user'变量,但html页面并没有显示user.username ...任何想法为什么会发生这种情况:(??

由于

3 个答案:

答案 0 :(得分:0)

使用非user的其他名称。似乎RequestContext覆盖user变量。

答案 1 :(得分:0)

请参阅设置TEMPLATE_CONTEXT_PROCESSORS的默认django.contrib.auth.context_processors.auth

  

如果TEMPLATE_CONTEXT_PROCESSORS包含此处理器,则每个RequestContext都将包含以下变量:

     
      
  • user - 表示当前登录用户(或auth.User实例的AnonymousUser实例(如果客户端未登录)。
  •   
  • perms - django.contrib.auth.context_processors.PermWrapper的实例,表示当前登录用户拥有的权限。
  •   

所以你最好给你的user变量另一个名字。

答案 2 :(得分:0)

正如其他答案所说,不要使用变量名user。但更重要的是,在这种特殊情况下,ListView不是最好的通用类;相反,你最好使用DetailView,这使你的观点更加简单:

class UserPosts(DetailView):
    model = User
    template_name = 'app_blog/user_posts_page.html'
    context_object_name = 'listed_user'

模板中唯一的变化是使用listed_user而不是user变量。由于DetailView已查看pk网址参数,因此会自动选择并返回正确的User