django 前后端不分离,多个模板有相同的数据渲染,用 inclusion_tag 少写代码

2023-02-18 10:22:04 浏览数 (1)

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>友情链接&nbsp;<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

  1. app 目录下新建 templatetags 目录,包含 __init__.py 文件
  2. 在 templatetags 下新建自己的 my_tags.py,py 文件名模板引入时用到
代码语言:javascript复制
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 %}

0 人点赞