无法在 Django 上扩展 html 模板
Posted
技术标签:
【中文标题】无法在 Django 上扩展 html 模板【英文标题】:Cant extend html template on Django 【发布时间】:2017-07-16 07:16:21 【问题描述】:我无法将一个 html 文档 (child - base_home.html) 扩展到另一个父 html 文档 - base.html 我有下一个 Django 项目结构:
Testdjango/
blog/
migrations/
templates/
blog/
base.html
base_home.html
__init.py__
admin.py
apps.py
models.py
tests.py
urls.py
views.py
db.sqlite3
manage.py
我的父模板是一个base.html,代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
<meta name="description" content="">
<meta name="author" content="">
<title>% block title %% endblock % – Blog</title>
<!-- Bootstrap core CSS -->
<link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.3.7/journal/bootstrap.min.css" rel="stylesheet">
<!-- Custom styles for this template
<link href="starter-template.css" rel="stylesheet"> -->
</head>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Blog</a>
</div>
<div id="navbar" class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li class="active"><a href="#">Home</a></li>
<li><a href="#about">About</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
<div class="container">
% block content %
% endblock %
</div>
<!-- Bootstrap core javascript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</body>
</html>
我的“孩子”base_home.html 有下一个代码:
% extends "blog/base.html" %
% block title %
Home
% endblock %
% block content %
Lorem bla bla
% endblock %
在页面中我看不到 base_home.html 中的任何内容
【问题讨论】:
如果你渲染base_home.html
,你看到网页pgae上渲染的html内容了吗?
请展示你的观点。
我的看法:from django.http import HttpResponse, request from django.shortcuts import render # Create youcoding=utf-8r views here. def home(request): return render(request, 'blog/base.html')
@karthikr,不,从 base_home.html 看不到任何东西
你能粘贴扩展错误的堆栈跟踪吗?到时候调试会很容易。我的猜测是,您没有在 settings.py 中正确给出 template_dirs 路径。
【参考方案1】:
Django 无法识别您要结束的块。你需要定义它。
% extends "blog/base.html" %
% block title %
Home
% endblock title %
% block content %
Lorem bla bla
% endblock content %
【讨论】:
没有。您不必一定在endblock
中提及区块名称。它是可选的。检查docs。
@dennis-slimmers 很遗憾,它也不能正常工作【参考方案2】:
试试
% extends "base.html" %
而不是
% extends "blog/base.html" %
【讨论】:
【参考方案3】:您可以通过两种方式扩展模板
include
## 将 html 的特定部分包含在模板中
extends
## 将普通 html 扩展为 diff 页面
base.html
<html>
<head></head>
<body>
======
======
</body>
</html>
home.html
If base.html in any folder please mention folder name dont put slash(/) before the foldername `% extends 'foldername/base.html' %`
% extends 'base.html' % ## you can see the base.html styles in the home.html
假设您需要包含特定的 div、表格或代码使用部分
% include 'base.html' %
如果它在文件夹中 % include 'foldername/base.html' %
【讨论】:
我从 base_home 中删除“扩展”并放入 % include "blog/base_home.html" %。现在我看到 % block content % 但看不到 % block title % (home)include
仅用于在 html 中包含特定部分,请使用 extends
所以你说我的代码好不好?但我尝试在 base_home.html 中仅使用 % extends "base.html %
或 % extends "blog/base.html" %
,但它对我不起作用。可能设置有问题?【参考方案4】:
你有类似的东西
TEMPLATES = [
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'APP_DIRS': True,
'DIRS': [
str(ROOT_DIR.path('templates')),
],`...
在您的设置中?
您是否在项目设置INSTALLED_APPS
中注册了您的博客应用程序?
【讨论】:
【参考方案5】:您的模板看起来不错,请确保您的模板设置看起来像这样,并且您已将应用添加到 INSTALLED_APPS
。
TEMPLATES = [
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS':
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
,
,
]
由于base.html
和base_home.html
在同一个目录中,因此扩展基数为,
% extends "base.html" %
【讨论】:
Django 使用模板文件夹。所以我需要写“blog/base.html”,因为目录“templates”中的目录“blog”【参考方案6】:我想我找到了答案。在我看来,我已经返回渲染(请求,“blog/base.html”)。我把它改成返回 render(request, "blog/base_home.html") - 我有扩展的地方。现在它的工作。请告诉我,这是真的吗?
【讨论】:
以上是关于无法在 Django 上扩展 html 模板的主要内容,如果未能解决你的问题,请参考以下文章