Django模板的继承与模板标签URL的使用
模板标签URL的使用
法一:
1.若模板中的链接地址使用的是硬编码的 URL,例如 <a href="/rango/about/">About</a>
。当修改url.py中的 URL 映射,就要更新对应的所有 URL 引用。使用模板标签 url 查询 urls.py 文件中的 URL 模式,动态插入 URL 路径。在使用动态URL时Django 模板引擎会检查 urls.py 模块中有没有 name 属性的值为 about 的 URL 模式,然后反向匹配URL。
#在url.py模块中
url(r'^about/', views.about, name='about'),
#在模板应用动态url时
<a href="{% url 'about' %}">About</a>
法二:
URL 模式也可以不通过名称引用,而是直接引用视图,此时,必须保证应用的 views.py 模块中有名为 about 的视图。如下所示“
<a href="{% url 'rango.views.about' %}">About</a>
对于含有多个应用的Django项目,如果两个应用存在同名的视图,使用URL模板标签就会冲突。
解决办法:
在每个应用的url.py模块给应用设置一个名字(因为每个应用的名字不会重复),如下:
# file:rango/urls.py
app_name = 'rango' #为应用起的别名
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^about/', views.about, name='about'),
url(r'^category/(?P<category_name_slug>[\w\-]+)/$', views.show_category, name='show_category'),
]
此时在使用模板标签URL时就应该如下使用:
<a href="{% url 'rango:add_page' category.slug %}">Add Page</a>
模板的继承
整体步骤:
使用模板继承的基本步骤如下。
1. 找出模板中重复出现的部分,例如页头、侧边栏、页脚和内容区。有时,你可以把各页面的结构画在纸上,这样便于找出通用的部分。
2. 创建一个基模板(base template),实现页面的基本骨架结构,提供通用的部分(例如页头的徽标和标题,页脚的版权声明),并定义一些区块(block),以便在不同的页面调整所显示的内容。
3. 为应用的不同页面创建专门的模板,都继承自基模板,然后指定各区块的内容。
<!DOCTYPE html>
{% load staticfiles %}
<html>
<head lang="en">
<meta charset="UTF-8" />
<title>Rango</title>
</head>
<body>
<!-- 各页面的具体内容 -->
</body>
</html>
定义区块:
创建好基模板之后,接下来要指明模板中的哪些部分可由继承它的模板覆盖。为此,要使用block 标签。例如,可以像下面这样在 base.html 模板中添加 body_block 区块:
<!DOCTYPE html>
{% load staticfiles %}
<html>
<head lang="en">
<meta charset="UTF-8" />
<title>Rango</title>
</head>
<body>
{% block body_block %} ############ 区块
{% endblock %} ##################
</body>
</html>
在区块之间可以指定默认的类容。在创建个页面的模板时,我们就都可以继承base.heml这个基模板,然后根据自己的需求覆盖区块之间的类容,定义自己想要的内容。
模板继承
创建好基模板之后,便是更新其他的模板,让其继承基模板,如下:
{% extends 'rango/base.html' %}
注:若需要继承的的模板要用到静态文件,需要在模板文件上添加
{% load staticfiles %}
自定义模板标签
在Django的应用下新建一个templatetages目录,并在该目录下新建两个模块:一个命名为 init.py,内容为空;另一个命名为xxxxxx.py,并在xxxxxx.py写入以下代码:
from django import template
from rango.models import Category
register = template.Library()
@register.inclusion_tag('rango/cats.html')
def get_category_list():
return {'cats': Category.objects.all()}
register = template.Library()为注册自定义标签,注册过系统才能认识,写法固定。但是从register.inclusion_tag() 装饰器可以看出,这个函数需要 rango/cats.html 模板的支持。故应该在templates下的rango下创建一个cats.html模板。
注:修改模板标签后要重启 Django 开发服务器,否则 Django 不会注册新标签。