django 前后端不分离,多个页面有相同的数据显示,按照普通做法:
可以在每个 view 里面查询一次给到模板。
这种做法,代码重复量太高,修改时极不方便。为此找到 django 包含标签 功能可以解决 前端页面有相同数据显示而只写一次查询代码的方法。
django 的包含标签的功能,个人理解 是把 相同查询的数据块独立出来,做成一个页面,把页面包装成标签,在需要的页面引用标签。
1. 把 相同数据块的模板,写成一个单独的 模板页面
# joyootemplatesfriend_url_show.html
代码语言:javascript复制<div class="am-u-sm-12 am-u-md-4- am-u-lg-4">
<h3>常用网站</h3>
<p>
<ul>
{% for item in common_url %}
<li><a href="{{ item.site_link }}">{{ item.site_name }}</a></li>
{% endfor %}
</ul>
</p>
</div>
<div class="am-u-sm-12 am-u-md-4- am-u-lg-4">
<h3>友情链接 <a href="{% url "blog:friendUrlAdd" %}"> </a></h3>
<p>
<ul>
{% for item in friends_url %}
<li><a href="{{ item.site_link }}">{{ item.site_name }}</a></li>
{% endfor %}
</ul>
</p>
</div>
2. 独立数据块,做成标签
# joyooblogtemplatetagsmy_tags.py
- app 目录下新建 templatetags 目录,包含 __init__.py 文件
- 在 templatetags 下新建自己的 my_tags.py,py 文件名模板引入时用到
from django import template
from blog.models import FriendsURL
from django.core.cache import cache
from joyoo.settings import CACHE_TIMEOUT_ARTICLE # 缓存时间
register = template.Library()
# friend_url_show.html 数据块模板
@register.inclusion_tag("friend_url_show.html")
def get_friends_url():
"""
获取友情链接
:return:
"""
friends_url = cache.get("friends_url")
if not friends_url:
friends_url = FriendsURL.objects.filter(show_status=True).filter(category="1")
cache.set("friends_url", friends_url, CACHE_TIMEOUT_ARTICLE)
common_url = cache.get("common_url")
if not common_url:
common_url = FriendsURL.objects.filter(show_status=True).filter(category="2")
cache.set("common_url", common_url, CACHE_TIMEOUT_ARTICLE)
return {"friends_url": friends_url, "common_url": common_url}
3. 在需要该数据的模板页面引用自定义的标签
# joyootemplateslw-index-noslider.html
代码语言:javascript复制{# 模板抬头就引入 自定义标签库 my_tags,就是那个 py 文件名称 #}
{% load my_tags %}
{# 在需要的地方引用 标签,就是 my_tags.py 里面的函数名称 #}
{% get_friends_url %}