如果这里的任何人都是ASP.NET专业版,您可能会知道用户控件的含义。我希望在django中创建一个类似的。
所以,我的问题是我的网站上有几个页面,但我需要在每个页面中都有一个搜索栏。由于我需要views.py来操作这个搜索栏,我不能做一个简单的
方法{% include 'something.html' %}
因此,任何人都可以建议我该怎么做?
答案 0 :(得分:1)
有几种方法可以实现您想要做的事情:
上下文处理器可以使用值扩充模板上下文,而不管加载哪个模板。它们类似于Rails中的过滤器。
模板标签,如上下文处理器,可以完成您在Python中可以做的任何事情,但是在模板级别实现。
如果你需要在每个模板上都有一些东西,最简单的方法之一是使用包含标记,它也可以接受传递给它的值。包含标记可以在您的最高级别模板(也称为MasterPage)上实现,只要您不将其放在块中并覆盖它,它就会出现在其继承链中包含该模板的每个页面上。
如果它只是想要包含在每个页面上的内容,并且不需要进行任何处理,那么您应该能够将所需的代码放在最顶层的模板中,并让后续模板继承。
我通常有一个“base.html”模板,我的所有模板都继承自该模板。如果我需要在每一页都有东西,我就把它放在那里。如果它是我默认需要的东西,但希望能够在后续模板中增加它,我会将它放入一个块中。该块将允许您包含或覆盖其默认内容。
答案 1 :(得分:1)
我知道这篇文章有点旧,但我刚刚遇到它,发现了一种有效的解决方案。我称之为解决方案,因为它是一种解决方法。
我有几个不同的网站,我想在其中显示日志信息。这个显示总是看起来一样(它有相同的html),并且后面有相同的数据库表和模型类。
我的解决方案/解决方法使用django过滤器:
我将日志条目列表放在上下文中
context = {'list_log': Log.objects.filter(condition = True) }
template = loader.get_template('my_html_file.html')
return HttpResponse(template.render(context, request))
我使用自定义过滤器
{{ list_log|get_log_uc|safe }}
我使用此自定义过滤器加载另一个html文件
@register.filter
def get_log_uc(list_log):
template = loader.get_template('user_control_log.html')
context = { 'list_log' : log }
return template.render(context)
我有用户控件等效的html
{% for log in list_log %}
<p>log.something</p>
{% endfor %