代码之家  ›  专栏  ›  技术社区  ›  Bernhard Vallant

Django:重写和扩展应用程序模板

  •  42
  • Bernhard Vallant  · 技术社区  · 14 年前

    是否有人知道如何重写原始模板,同时扩展它,以便您只需重写要更改的特定块?(事情是这样的 没有

    编辑:亚当·泰勒在评论中指出 Django 1.9 on 这是可能的,没有任何黑客。

    6 回复  |  直到 8 年前
        1
  •  35
  •   Community Egal    7 年前

    我想答案来自 this related question 是相关的;目前,最好的解决方案似乎是使用来自 django-apptemplates package on PyPI ,所以你可以使用 pip 安装(例如。 pip install django-apptemplates ).

    'apptemplates.Loader',
    

    给你的 TEMPLATE_LOADERS 列入 settings.py ,并使用

    {% extends "admin:admin/index.html" %}
    

        2
  •  7
  •   papirrin    11 年前

    作为更新,这似乎是一个流行的问题。我用过 overextends app 没有任何问题。它提供了一个新的关键字 过度扩张 它允许扩展同名模板。

    使用pip很容易安装:

     pip install -U django-overextends
    
        3
  •  7
  •   Flimm    8 年前

    Django 1.9及更高版本 this feature :

    Django模板加载程序现在可以递归地扩展模板。

    app1 内容如下:

    app1/templates/example/foobar.html :

    <p>I'm from app1</p>
    {% block main %}{% endblock %}
    

    你可以用一个文件扩展它 app2 (注意模板名 example/foobar.html

    app2/templates/example/foobar.html :

    {% extends "example/foobar.html" %}
    {% block main %}
      <p>I'm from app2</p>
    {% endblock %}
    

    最终结果应该是:

    <p>I'm from app1</p>
    <p>I'm from app2</p>
    
        4
  •  2
  •   akaihola dnlcrl    14 年前

    在Django维基中,Simon Willison展示了 a trick 达到“自扩展模板”的效果。如果您使用 app_directories 不过,模板加载程序。

    在一个新目录中用符号链接应用程序的模板目录可能会起到作用。

        5
  •  -1
  •   Paulo Scardine    11 年前

    我误解了这个问题,我原来的答案只适用于管理应用程序,它有一个内置的模板扩展机制。对于其他缺乏这种机制的应用程序,我只需分叉原始模板,而不是像所选答案建议的那样摆弄自定义模板加载程序。如果您担心分叉,您还可以实现一个扩展机制,并在您认为值得的情况下为原始项目作出贡献。


    [原始答案]

    直接罚款 manual :

    为了继续上面的例子,我们想在页面模型的历史工具旁边添加一个新链接。在查看change_form.html之后,我们确定只需要覆盖object tools块。因此,这里是我们的新change_form.html:

    {% extends "admin/change_form.html" %}
    {% load i18n %}
    {% block object-tools %}
    {% if change %}{% if not is_popup %}
      <ul class="object-tools">
        <li><a href="history/" class="historylink">{% trans "History" %}</a></li>
        <li><a href="mylink/" class="historylink">My Link</a></li>
        {% if has_absolute_url %}
            <li><a href="../../../r/{{ content_type_id }}/{{ object_id }}/" class="viewsitelink">
                {% trans "View on site" %}</a>
            </li>
        {% endif%}
      </ul>
    {% endif %}{% endif %}
    {% endblock %}
    

        6
  •  -3
  •   seddonym    11 年前

    一个简单的方法是:

    假设您想要扩展和覆盖django/contrib/admin/templates/admin/change_form.html。

    其次,在myapp/templates/admin中创建自己的change_form.html。在顶部,放置以下内容:

    {% extends "admin/original_change_form.html" %}
    

    很简单!