我正在创建一个简单的Web应用程序,我需要有一个右侧边栏,其中包含用户的个人数据。它是一个包含20个字符串和10个模型对象的字典。我希望这个数据集包含在每个网页中。有两种选择。
(a)我为每一个动作做了类似的事情:
data = {
'somedata', somedata #data created for this action needed for the page
}
data.update(ul.getRightSidebarContent(user)) #add all data to be shown for the user
variables = RequestContext(request, data)
return render_to_response("anypage.html", variables)
(b)创建ajax操作并将它们放在base.html模板中(由所有模板页面继承),因此在每个页面请求时,ajax操作将加载右侧栏内容。
还有其他解决方案吗?哪一个是最好的?每种解决方案可能存在的缺点?你能详细说明吗?
谢谢, 克里斯
答案 0 :(得分:5)
从django方面有两种解决方案:
您可以使用context processor在渲染页面之前将此数据添加到您的上下文中。我认为这对您的问题是一个非常好的解决方案,但请记住,只有在所有视图中添加RequestContext
对象时才会调用上下文处理器 - 如果您不这样做,处理器的数据将会不加。一个缺点可能是上下文处理器将被这些视图中的每一个调用,如果你不需要它们可能会产生一些开销;但我不认为这对你来说应该是个问题......
您可以编写custom template tags来将这些数据提取到模板中,并在需要的地方重复使用。让模板标签已经在模板中呈现数据可能是一个优势,因此您不必再使用模板处理模板,只需将模板标记放在您希望内容显示的位置。
我认为将它放在每个视图代码中的第一种可能性并不重要,你必须重复很多事情......如果输出数据的生成可能需要很长时间或使用其他网页,那么ajax解决方案是有意义的服务,如果你不得不等待,你不希望有一个缓慢加载的页面......
答案 1 :(得分:4)
我使用自定义模板标签,非常方便:
tags.py
from django import template
from my.models import model_name_or_*
register = template.Library()
@register.inclusion_tag('path/to/tag/template.html')
def my_tag():
return { 'myData': MyModel.objects.all(), }
@register.inclusion_tag('path/to/tag2/template.html')
def my_tag2():
return { 'myData2': MyModel.objects.all(), }
标签模板是您想要的,例如:
<ul>
{% for item in myData %}
<li>{{ item.name }}</li>
{% endfor %}
</ul>
如果你想在你的模板中使用这个标签,只需输入:
{% load tags %}
其中tag是您标记文件并使用{% my_tag %}
答案 2 :(得分:2)