Python 在django模板中,如何根据body部分中的自定义标记参数动态更新header部分

Python 在django模板中,如何根据body部分中的自定义标记参数动态更新header部分,python,django,Python,Django,我正在构建一个Django列表应用程序。要使用它,模板应如下所示: {% load django_listing %} <html> <head> ... {% include "django_listing/header.html" %} ... </head> <body> ... {% render_listing data some_para

我正在构建一个Django列表应用程序。要使用它,模板应如下所示:

    {% load django_listing %}
    <html>
    <head>
    ...
    {% include "django_listing/header.html" %}
    ...
    </head>
    <body>
    ...
    {% render_listing data some_parameters %}
    ...
    {% include "django_listing/footer.html" %}
    </body>
    </html>
{%load django_listing%}
...
{%include“django_listing/header.html”%}
...
...
{%render_列出一些_参数%}
...
{%include“django_listing/footer.html”%}
此模板直接用于
模板视图
。重要的是要知道,用户可以在模板中定义所有参数,列表是在自定义的
render_listing
标记中动态创建的,因此
一些_参数只在模板端已知(在
TemplateView
端未知)。用户仅在
TemplateView
上下文中提供数据


我想根据
一些参数
值动态声明一些CSS和JS。我在
{%include“django_listing/footer.html”%}
中成功地对JS执行了该操作,但对CSS则没有,因为在呈现
{%include“django_listing/header.html”%}
时,列表对象尚未创建

你知道如何根据
一些参数动态声明一些CSS吗?

可能有一种方法可以延迟
{%include“django_listing/header.html”%}
呈现?

最后,解决方案是为header创建一个模板标记,在其自身之前呈现剩余的内容:

class ListingHeaderNode(template.Node):
    def __init__(self, nodelist):
        self.nodelist = nodelist

    def render(self, context):
        remaining_output = self.nodelist.render(context)
        tpl = template.loader.get_template('django_listing/header.html')
        tpl_output = tpl.render(context.flatten())
        return f'{tpl_output}\n{remaining_output}'


@register.tag(name="render_listing_header")
def do_listing_header(parser, token):
    nodelist = parser.parse()
    return ListingHeaderNode(nodelist)
然后我可以使用它来代替包含:

    {% load django_listing %}
    <html>
    <head>
    ...
    {% render_listing_header %}
    ...
    </head>
    <body>
    ...
    {% render_listing data some_parameters %}
    ...
    {% render_listing_footer %}
    </body>
    </html>
{%load django_listing%}
...
{%render\u列表\u头%}
...
...
{%render_列出一些_参数%}
...
{%render\清单\页脚%}

最后,解决方案是为标题创建一个模板标记,该标记在标题之前呈现剩余的内容:

class ListingHeaderNode(template.Node):
    def __init__(self, nodelist):
        self.nodelist = nodelist

    def render(self, context):
        remaining_output = self.nodelist.render(context)
        tpl = template.loader.get_template('django_listing/header.html')
        tpl_output = tpl.render(context.flatten())
        return f'{tpl_output}\n{remaining_output}'


@register.tag(name="render_listing_header")
def do_listing_header(parser, token):
    nodelist = parser.parse()
    return ListingHeaderNode(nodelist)
然后我可以使用它来代替包含:

    {% load django_listing %}
    <html>
    <head>
    ...
    {% render_listing_header %}
    ...
    </head>
    <body>
    ...
    {% render_listing data some_parameters %}
    ...
    {% render_listing_footer %}
    </body>
    </html>
{%load django_listing%}
...
{%render\u列表\u头%}
...
...
{%render_列出一些_参数%}
...
{%render\清单\页脚%}

“列表对象尚未创建”这是什么意思?
render\u listing
标记具有更新传递给它的参数的副作用?为什么不在视图中生成列表,或者在一个标记中生成列表,并将其传递回上下文呢?我想给用户一个避免接触python代码的可能性:只需放置
render_listing
标记就足够了。如果您想在任何包含的模板中添加CSS和JS,就可以了“列表对象尚未创建“这意味着什么?
render_listing
标记具有更新传递给它的参数的副作用?为什么不在视图中生成列表,或者在一个标记中生成列表,并将其传递回上下文呢?我想给用户一个避免接触python代码的可能性:只需放置
render_listing
标记就足够了。如果您想在任何包含的模板中添加CSS和JS,就可以了