2

我有一个名为的应用程序exercise_tracker,并希望base.html使用两个模板扩展我的应用程序:exercise_list.htmlfooter.html. 因为exercise_list.html我已经设置了一个viewfooter.html。它不会呈现footer.html. 你能告诉我我做错了什么吗?

视图.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>

练习列表.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 %}
4

3 回答 3

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>

它可能会解决您的问题。

于 2018-12-22T09:16:55.383 回答
2

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

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

将页脚保留在单独的模板中是完全可以的,但是您需要将它也作为一个块添加到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和的 SO 问题extend是一个很好的起点:django templates: include and extends或者然后是关于模板继承 的优秀 django 文档。

希望对编码有所帮助和快乐!

于 2018-12-22T14:50:19.940 回答
0

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

这应该给你一个想法:

基础.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 %}
于 2018-12-22T14:21:43.950 回答