【问题标题】:Django extends only one templateDjango 只扩展了一个模板
【发布时间】:2019-05-22 11:44:46
【问题描述】:

我有一个名为exercise_tracker 的应用程序,并希望使用两个模板扩展我的base.html:exercise_list.html 和footer.html。对于exercise_list.html,我没有为footer.html 设置view。 它不会呈现footer.html 的内容。你能告诉我我做错了什么吗?

views.py

from django.shortcuts import render
from django.utils import timezone
from .models import Exercise

def exercise_list(request):
    exercises = Exercise.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
    return render(request, 'exercise_tracker/exercise_list.html', {"exercises": exercises})

base.html

<html>
    <body>
        {% block content %}
        {% endblock %}

        {% block footer %}
            <p>Footer placeholder</p>
        {% endblock %}
    </body>
</html>

exercise_list.html

{% extends 'exercise_tracker/base.html' %}

{% block content %}
    <table>
    {% for exercise in exercises %}
        <tr>
            <td>{{ exercise.date_learned }}</td>
            <td>{{ exercise.time_studied }}</td>
            <td>{{ exercise.language_learned }}</td>
            <td>{{ exercise.description|linebreaksbr }}</td>
        </tr>
    {% endfor %}
    </table>
{% endblock %}

页脚.html

{% extends 'exercise_tracker/base.html' %}

{% block footer %}
    <p>Footer</p>
{% endblock %}

【问题讨论】:

  • 我认为两个扩展不能一起工作。您可以对主要内容使用扩展,并使用包含标签添加页眉和/或页脚。

标签: python django django-templates django-2.1


【解决方案1】:

使用 extends 模板标签告诉 Django 仅使用在使用的子模板中定义的块内容填充父模板中的块!

当您在 exercice_list.html 中仅填充 content 块时,当您调用exercice_list 查看。这是因为 django 不会寻找其他模板可能会扩展父模板,因此它并不关心在某处也扩展了它的 footer.html。如果您希望在调用 exercice_list 视图时包含来自 footer.html 的内容,那么您需要将其添加到 base.html 中或然后添加到 exercice_list.html.

将页脚保留在单独的模板中是完全可以的,但您需要将它也作为一个块添加到 exercice_list.html:

{% extends 'exercise_tracker/base.html' %}
{% block content %}
<table>
{% for exercise in exercises %}
    <tr>
        <td>{{ exercise.date_learned }}</td>
        <td>{{ exercise.time_studied }}</td>
        <td>{{ exercise.language_learned }}</td>
        <td>{{ exercise.description|linebreaksbr }}</td>
    </tr>
{% endfor %}
</table>
{% endblock %}

{% block footer %}
    {% include "footer.html" %}
{% endblock %}

您的 footer.html 可能如下所示:

<p>Footer</p>

如果您想对此进行更多阅读,关于include 和extend 的SO 问题是一个很好的起点:django templates: include and extends 或者关于 template inheritance 的优秀 django 文档。

希望对您有所帮助并祝您编码愉快!

【讨论】:

  • 感谢您解释我的问题的上下文。我现在明白为什么它不起作用了。
【解决方案2】:

我建议您编辑您的 exercise_list.html

{% extends 'exercise_tracker/base.html' %}

{% block content %}
    <table>
    {% for exercise in exercises %}
        <tr>
            <td>{{ exercise.date_learned }}</td>
            <td>{{ exercise.time_studied }}</td>
            <td>{{ exercise.language_learned }}</td>
            <td>{{ exercise.description|linebreaksbr }}</td>
        </tr>
    {% endfor %}
    </table>
{% endblock %}
{% block footer %}
   <p>Footer placeholder</p>
{% endblock %}

在 base.html

中
<html>
    <body>
        {% block content %}
        {% endblock %}

        {% block footer %}
        {% endblock %}
    </body>
</html>

它可能会解决您的问题。

【讨论】:

    【解决方案3】:

    您不需要单独的页脚模板。如果您对整个网站使用相同的页脚,您可以在 base.html 中对其进行编码。如果您只想在某些地方覆盖它,只需在基本模板中为页脚添加一个块,然后在您想要的地方覆盖它。

    这应该会给你一个想法:

    Base.html:

    <!DOCTYPE html>
    <html lang="en" dir="ltr">
      <head>
        <meta charset="utf-8">
        <title></title>
        // Site-Wide Links , CDN go here
        {% block head %} 
        {% endblock %
      </head>
      <body>
    // Base code goes here
        {% block content %}
        {% endblock %}    
    <footer>
    // Base Footer goes here
        {% block footer %}
        {% endblock %}
    
    </footer>
    
      </body>
    </html>
    

    Some_template.html:

    {% extends 'exercise_tracker/base.html' %} 
        {% block head %}
        //Your CSS , CDN here 
        {% endblock %}
    
        {% block content %}
     // Your HTML here
        {% endblock %}
    
        {% block footer %}
    //Your Footer Here if you need to add something
        {% endblock %}
    

    【讨论】:

    • 您也可以在模板中使用{% include 'something/footer.html' %}
    猜你喜欢
    • 1970-01-01
    • 2016-02-23
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 2021-10-08
    相关资源
    最近更新 更多