我正在练习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 ...任何想法为什么会发生这种情况:(??
由于
答案 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
。