Django模板变量,RequestContext和上下文处理器

时间:2011-04-20 03:06:03

标签: django django-templates

修改 我正在构建一个网站的消息传递部分但由于某种原因我只是注意到该功能实际上不会在模板中显示消息。以下是收件箱页面的功能和模板:

def show_inbox(request):
u = request.user
messages = Message.objects.filter(to_user=u)
context = RequestContext(request,{'messages':messages})
return render_to_response('users/messaging/inbox.html',context_instance=context)

<table class="table-list" cellspacing="0">
            <th>Subject</th>
            <th>Recieved at</th>
            <th>Read</th>
            <th>Replied</th>
            {% if not messages %}
                <tr><td class="left">No messages</td></tr>
            {% endif %}
            {% for message in messages %}
            <tr class="{% if forloop.counter|divisibleby:2 %}even{% else %}odd{% endif %}">
                <td class="left largetd">
                    <a href="{{ message.from_user.get_absolute_url }}"><img src="{{ message.from_user.profile_pic }}" class="small-pic" /></a>&nbsp;&nbsp;
                    <a href="{{ message.get_absolute_url }}">{{ message.message_subject }}</a>
                </td>
                <td class="text-center">
                         <span class="small-text italics">{{ message.message_date_time }}</span> 
                </td>
                <td class="smalltd text-center">{{ message.message_is_read }}</td>
                <td class="smalltd text-center"></td>
            </tr>
            {% endfor %}
        </table>

1 个答案:

答案 0 :(得分:3)

您在调用render_to_response()之前检查过 messages 变量是否确实有消息?否则,在生成的HTML上查看源代码并查看是否存在任何内容。你错过了&lt; tr &gt;在标题单元格周围标记。

另外,尝试稍微改变一下render_to_response。

return render_to_response('users/messaging/inbox.html', {'messages': messages})

默认情况下,模板将使用填充了提供的字典值的 Context 实例进行渲染。因此,您可以用这种更简单的形式来调用它。您没有在视图模板中使用任何请求变量,因此您不需要RequestContext,它使用context processors为您的模板提供从请求中提取的其他信息。

@fceruti与django.contrib.messages发生冲突是正确的。当您使用RequestContext时,Django循环访问您的TEMPLATE_CONTEXT_PROCESSORS(在settings.py文件中声明),为您的模板提供更多变量。特别是'django.contrib.messages.context_processors.messages'添加了一个消息变量,它覆盖了你自己的变量。更改变量的名称,你就可以了。

  

按顺序应用每个处理器。   这意味着,如果一个处理器添加了一个   变量到上下文和第二个   处理器添加一个变量   相同的名称,第二个将覆盖   第一个。

相关问题