Django的inclusion用法备忘
发布时间:2021-07-06
浏览量: 1476
文章分类: python
Django中的inclusion还是很方便的一个功能,就拿实际的情况来说吧,如果我要做一个全站任何页面都显示网页底部的友情链接功能。
如果本身页面都是继承自base.html的话,可能大部分人都会将这个功能放在母版中了。但是放在母版中其实有几个弊端,特别是在做模板宣传的时候,相当于每个函数都需要去传递数据,第一很不优雅,第二代码量很大,也不容易维护。其实django中早就提供了解决办法。那就是include方法。
还是用上面的模拟问题来拿出解决办法,也就是 我们需要在全站的页面底部显示"友情链接"功能。 接下来来剖析一下这个功能 1、后台能随时添加、删除友链; 2、前台访问首页、列表、明细页面页面底部都能看到最新的友链渲染。
解决方案(个人觉得目前是最优解决方案,也算优雅解决方案) 项目目录结构如下(已删除跟案例无关的代码)
└── website
├── __init__.py
├── admin.py
├── templates
│ ├── base.html
│ ├── inclusion
│ │ └── all_links.html
│ ├── index.html
├── templatetags
│ └── links.py
├── urls.py
└── views
├── __init__.py
├── login_views.py
这里需要注意看亮点
1、templates模板下的inclusion下的all_links.html ;
2、templatetags下的links.py;
只要有这两步就可以开始了。
links.py文件
主要是用来获取数据,提供数据给模板文件
from django.template import Library
from website.models import link_models
register = Library()
@register.inclusion_tag('inclusion/all_links.html') # 模板文件的路径
def all_links():
# 所有的友链
links_obj = link_models.Linkmodels.objects.all()
return {'links_obj':links_obj}
all_links.html模板文件
主要就是用来渲染模板的主要文件
{#% 循环渲染页面所有的友链 %#}
{% for item in links_obj %}
<a class="link-btn" href="{{ item.add }}" target="_blank">{{ item.name }}</a>
{% endfor %}
base.html
{% load static %}
{% load links %} # 注意这里是引入了我们创建的`templatetags下的文件名`
<!doctype html>
<html lang="zh-CN">
....
{#% 引入友链tag模板 %#}
{% all_links %} # 这里引入的是 `links.py`里面的函数名
</html>
只要上面几步就可以完美解决了。当然这里还有一些其他的问题,比如访问量大的时候每次查询数据库的问题,也可以在函数中后续改为缓存等其他方法就非常简单了。