Django 只扩展一个模板
Django extends only one template
我有一个名为 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 %}
footer.html
{% extends 'exercise_tracker/base.html' %}
{% block footer %}
<p>Footer</p>
{% endblock %}
我建议您修改 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>
也许可以解决您的问题。
您不需要单独的页脚模板。如果您对整个网站使用相同的页脚,您只需将其编码为 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 %}
使用 extends
模板标签告诉 Django 仅使用子模板中定义的块内容填充父模板中的块!
当您仅填充 exercice_list.html 中的 content
块时,则仅填充 [的 content
块base.html 将在您调用 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 文档
希望对您有所帮助,祝您编码愉快!
我有一个名为 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 %}
footer.html
{% extends 'exercise_tracker/base.html' %}
{% block footer %}
<p>Footer</p>
{% endblock %}
我建议您修改 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>
也许可以解决您的问题。
您不需要单独的页脚模板。如果您对整个网站使用相同的页脚,您只需将其编码为 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 %}
使用 extends
模板标签告诉 Django 仅使用子模板中定义的块内容填充父模板中的块!
当您仅填充 exercice_list.html 中的 content
块时,则仅填充 [的 content
块base.html 将在您调用 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.
希望对您有所帮助,祝您编码愉快!