二、Django模板的继承与模板标签URL的使用

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 不会注册新标签。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值