【问题标题】:static files and django templates静态文件和 django 模板
【发布时间】:2013-06-18 02:42:58
【问题描述】:

我想把我所有的link标签放在<head>中。

但是,当我通过内置的 include 标签包含共享模板时,我不知道如何在我的 DOM 的 head 中呈现所有 link 标签。所以我的link 标签会在我碰巧包含我的共享模板的地方呈现。我在下面添加了代码以更好地说明我的问题。

布局:

<html>
<head>
    {% block references %}{% endblock %}
</head>
<body>
    {% block content %}{% endblock %}
</body>
</html>

使用模板扩展布局:

{% extends "layout.html" %}
{% load staticfiles %}
{% block references %}
    <link rel="stylesheet" href="{% static "myStylesheet.css" %}" type="text/css">
{% endblock %}
...
{% include "mySharedTemplate.html" %}
...

共享模板。请注意,此模板在我的几个但不是所有模板之间共享:

{% load staticfiles %}
<link rel="stylesheet" href="{% static "mySharedTemplateStylesheet.css" %}" type="text/css">
...

在使用共享模板时,有没有办法将我所有的 link 标签放在我的 DOM 的 head 中?有没有完全不同或更好的方法来做到这一点?我的第一个 django 项目已经一周了,所以即使是基本功能的建议也可能对我有所帮助!

【问题讨论】:

    标签: python css django dom django-templates


    【解决方案1】:

    我想你正在寻找{{block.super}}

    例如Layout.html:

    <html>
    <head>
    {% load staticfiles %}
    {% block references %}
       <link rel="stylesheet" href="{% static "mySharedTemplateStylesheet.css" %}" type="text/css">
    
    {% endblock %}
    </head>
    <body>
        {% block content %}{% endblock %}
    </body>
    </html>
    

    在 Template.html 中:

    {% extends "layout.html" %}
    {% load staticfiles %}
    {% block references %}
        {{block.super}}
        <link rel="stylesheet" href="{% static "myStylesheet.css" %}" type="text/css">
    {% endblock %}
    

    如果您不想对所有页面使用mySharedTemplateStylesheet.css,则不要使用{{block.super}},例如Template2.html:

     {% extends "layout.html" %}
        {% load staticfiles %}
        {% block references %}
            <link rel="stylesheet" href="{% static "myStylesheet.css" %}" type="text/css">
        {% endblock %}
    

    【讨论】:

    • 我不想把mySharedTemplateStylesheet.css放在我的布局中,因为不是所有的模板都使用共享模板标记。
    • 我宁愿只在 template.html 中包含mySharedTemplateStylesheet.css 而不是使用block.super。他们基本上都做同样的事情。 block.super 只是混淆代码并使 layout.html 中的 references 块包含不需要的代码。
    • 我自己添加了一个答案。如果您认为是这种情况,请解释为什么您认为您的解决方案或其他解决方案更好。我很乐意参与!我讨厌提供自己的答案:)。
    【解决方案2】:

    layout.html:

    <html>
    <head>
        {% block references %}{% endblock %}
    </head>
    <body>
        {% block content %}{% endblock %}
    </body>
    </html>
    

    layout-with-shared-css.html:

    {% extends "layout.html" %}
    {% load staticfiles %}
    {% block references %}
        <link rel="stylesheet" href="{% static "myStylesheet.css" %}" type="text/css">
    {% endblock %}
    

    没有共享模板的模板:

    {% extends "layout.html" %}
    {% load staticfiles %}
    {% block references %}
        <link rel="stylesheet" href="{% static "myStylesheet.css" %}" type="text/css">
    {% endblock %}
    

    带有共享模板的模板:

    {% extends "layout-shared-css.html" %}
    {% load staticfiles %}
    {% block references %}
        {{ block.super }}
        <link rel="stylesheet" href="{% static "myStylesheet.css" %}" type="text/css">
    {% endblock %}
    

    【讨论】:

    • 我不想这样做,因为不是我所有的页面都使用“共享模板”。
    • @steaks,“共享模板”使用了多少次?如果经常使用,请尝试 Victor Castillo Torres 的回答。
    • @steaks,我更新了很少使用“共享模板”的代码。
    • 您的答案将共享模板的链接标记放在引用块中。这不是因为标记会在 DOM 的head 中呈现而导致共享模板呈现不正确吗?
    • 不,还有更多。这就是我所说的省略号。见...
    【解决方案3】:

    我找到了一个 hacky 方法来做到这一点。我对它不是很满意。我发现我可以使用简单的if 块来切换我想要使用include 标记渲染模板的哪些部分。这使我可以分别包含我的参考资料和内容。 (注意,我可以通过将引用和内容分成单独的文件来解决这个问题。但这似乎比这个解决方案更乏味。)

    我比当前的答案更喜欢这个解决方案,因为它允许我的共享模板与其他模板隔离。在使用可以混合搭配的功能时,保持这种模块化设计很重要(这就是我想用我的共享模板做的事情)。

    模板:

    {% extends "layout.html" %}
    {% load staticfiles %}
    {% block references %}
        <link rel="stylesheet" href="{% static "myStylesheet.css" %}" type="text/css">
        {% include "mySharedTemplate.html" with references="True" %}
    {% endblock %}
    ...
    {% include "mySharedTemplate.html" with content="True" %}
    ...
    

    共享模板:

    {% if references %}
        {% load staticfiles %}
        <link rel="stylesheet" href="{% static "mySharedTemplateStylesheet.css" %}" type="text/css">
    {% endif %}
    {% if content %}
        ...
    {% endif %}
    

    为了说明为什么我认为我的模块化设计很重要:

    想象一下,我有许多共享模板和许多常规模板,每个模板都以不同的方式使用共享模板。我的模块化方法使常规模板可以轻松地以最适合它们的灵活方式使用共享模板。

    模板 2:

    {% extends "layout.html" %}
    {% load staticfiles %}
    {% block references %}
        <link rel="stylesheet" href="{% static "myStylesheet.css" %}" type="text/css">
        {% include "mySharedTemplate.html" with references="True" %}
        {% include "mySharedTemplate2.html" with references="True" %}
    {% endblock %}
    ...
    {% include "mySharedTemplate.html" with content="True" %}
    {% include "mySharedTemplate2.html" with content="True" %}
    ...
    

    模板 3:

    {% extends "layout.html" %}
    {% load staticfiles %}
    {% block references %}
        <link rel="stylesheet" href="{% static "myStylesheet.css" %}" type="text/css">
        {% include "mySharedTemplate2.html" with references="True" %}
        {% include "mySharedTemplate3.html" with references="True" %}
        {% include "mySharedTemplate4.html" with references="True" %}
    {% endblock %}
    ...
    {% include "mySharedTemplate4.html" with content="True" %}
    {% include "mySharedTemplate3.html" with content="True" %}
    {% include "mySharedTemplate2.html" with content="True" %}
    ...
    

    请注意,模板 2 和模板 3 可以以适合它们的方式使用共享模板,而无需太多样板代码。

    【讨论】:

    • 共享模板如何分成两部分:一份供参考,一份供参考。
    • @falsetru 我想我试图通过将它们放在单独的 if 块中来做到这一点。有没有更好的方法可以做到这一点?我可以在include 标签中包含特定的blocks 吗?
    • 我在回答中解释了为什么我没有这样做。 注意,我可以通过将我的引用和内容分成单独的文件来解决这个问题。但这似乎比这个解决方案更乏味。
    • 除了你的方法之外,我不知道如何包含特定的块。
    【解决方案4】:

    使用verbatim标签停止模板引擎将你的标签解释为他的标签。

    {% verbatim %}
        {{if dying}}Still alive.{{/if}}
    {% endverbatim %}
    

    Django and Chartjs template conflict

    【讨论】:

      猜你喜欢
      • 2014-12-10
      • 2012-02-25
      • 2011-12-18
      • 1970-01-01
      • 2012-12-10
      • 2013-01-23
      • 2014-06-06
      • 2012-02-28
      • 1970-01-01
      相关资源
      最近更新 更多