【问题标题】:Django's get_context_data function not working?Django 的 get_context_data 函数不起作用?
【发布时间】:2013-07-27 06:35:43
【问题描述】:

我正在练习 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...知道为什么会发生这种情况 :(??

谢谢

【问题讨论】:

  • 嗯...尝试从User模型打印{{ user }}或其他字段。

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


【解决方案1】:

使用不是user 的另一个名称。似乎 RequestContext 覆盖了user 变量。

【讨论】:

    【解决方案2】:

    请查看默认的TEMPLATE_CONTEXT_PROCESSORS,其中设置了django.contrib.auth.context_processors.auth

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

    • user – 代表当前登录用户的 auth.User 实例(或 AnonymousUser 实例,如果客户端未登录)。
    • permsdjango.contrib.auth.context_processors.PermWrapper 的一个实例,代表当前登录用户拥有的权限。

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

    【讨论】:

      【解决方案3】:

      正如其他答案所说,不要使用变量名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 URL 参数,它会自动选择并返回正确的User

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-27
        • 2021-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-05
        相关资源
        最近更新 更多