Django等同于ASP.NET UserControl

时间:2013-02-15 14:34:05

标签: django django-templates django-views

如果这里的任何人都是ASP.NET专业版,您可能会知道用户控件的含义。我希望在django中创建一个类似的。

所以,我的问题是我的网站上有几个页面,但我需要在每个页面中都有一个搜索栏。由于我需要views.py来操作这个搜索栏,我不能做一个简单的

方法
{% include 'something.html' %}

因此,任何人都可以建议我该怎么做?

2 个答案:

答案 0 :(得分:1)

有几种方法可以实现您想要做的事情:

Context Processors

Template Tags

上下文处理器可以使用值扩充模板上下文,而不管加载哪个模板。它们类似于Rails中的过滤器。

模板标签,如上下文处理器,可以完成您在Python中可以做的任何事情,但是在模板级别实现。

如果你需要在每个模板上都有一些东西,最简单的方法之一是使用包含标记,它也可以接受传递给它的值。包含标记可以在您的最高级别模板(也称为MasterPage)上实现,只要您不将其放在块中并覆盖它,它就会出现在其继承链中包含该模板的每个页面上。

如果它只是想要包含在每个页面上的内容,并且不需要进行任何处理,那么您应该能够将所需的代码放在最顶层的模板中,并让后续模板继承。

我通常有一个“base.html”模板,我的所有模板都继承自该模板。如果我需要在每一页都有东西,我就把它放在那里。如果它是我默认需要的东西,但希望能够在后续模板中增加它,我会将它放入一个块中。该块将允许您包含或覆盖其默认内容。

答案 1 :(得分:1)

我知道这篇文章有点旧,但我刚刚遇到它,发现了一种有效的解决方案。我称之为解决方案,因为它是一种解决方法。

我有几个不同的网站,我想在其中显示日志信息。这个显示总是看起来一样(它有相同的html),并且后面有相同的数据库表和模型类。

我的解决方案/解决方法使用django过滤器:

    views.py中的
  1. 我将日志条目列表放在上下文中

    context = {'list_log': Log.objects.filter(condition = True) }    
    template = loader.get_template('my_html_file.html')    
    return HttpResponse(template.render(context, request))
    
  2. my_html_file.html中的
  3. 我使用自定义过滤器

    {{ list_log|get_log_uc|safe }}
    
  4. 在filters.py中的
  5. 我使用此自定义过滤器加载另一个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)
    
  6. user_control_log.html中的
  7. 我有用户控件等效的html

    {% for log in list_log %}
       <p>log.something</p>
    {% endfor %