正在进入ing...

Django的inclusion用法备忘

发布时间:2021-07-06 浏览量: 317 文章分类: 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>

只要上面几步就可以完美解决了。当然这里还有一些其他的问题,比如访问量大的时候每次查询数据库的问题,也可以在函数中后续改为缓存等其他方法就非常简单了。