django 模板与定制admin

本文详细介绍了Django模板标签的使用,包括simple_tag、inclusion_tag等,并展示了如何自定义模板标签和过滤器。同时,解释了模板的查找顺序、钩子覆盖以及如何覆盖admin中的钩子,是Django开发者深入理解模板机制的好资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

django补充

参考文章:https://blog.youkuaiyun.com/weixin_42134789/article/details/82772027

参考文章:https://www.cnblogs.com/fungitive/p/9136158.html

1.模板标签

  • 问题引出:什么是模板标签tags?

    模板标签都是放在{% %}括号里的,常见的模板标签有{% load xxxx %}, {% block xxxx %}, {% if xxx %}, {% url 'xxxx' %}。这些模板标签的本质也是函数标签名一般即为函数名。这些标签的主要作用包括载入代码渲染模板或对传递过来的参数进行一定的逻辑判断或计算后返回。

    示例标签

    <a href="{% url 'school' id %}">学校连接</a>
  • Django模板标签(tags)的分类
    • simple_tag (简单标签) : 处理数据,返回一个字符串或者给context设置或添加变量。
    • inclusion_tag (包含标签) : 处理数据,返回一个渲染过的模板。
    • 视图view里设置context(模板后的字典),然后通过它来传递数据给模板。 一个context是一系列变量和它们值的集合。通过使用simple_tag, 我们可以在视图外给context设置或添加变量。注: Django 1.9以后不再支持assignment_tag了,均使用simple_tag。
  • 补充:django 的 app 查找顺序,先查找最外层templates中没有,再去app中的templates查找对应的文件。

2.自定义模板标签

  • 首先你要在你的app目录下新建一个叫templatetags的文件夹(不能取其它名字), 里面必需包含__init__.py的空文件。在该目录下你还要新建一个python文件专门存放你自定义的模板标签函数;

  • # 1.第一步# 在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.# 2.第二步# 在app中创建templatetags模块(模块名只能是templatetags)# 3.第三步# 创建任意 .py 文件,如:my_tags.py
  • 编写函数

    image-20220404142348469

    # my_tags.pyfrom django import templatefrom django.utils.safestring import mark_safe# 实例化对象register=template.Library()@register.simple_tagdef mytag():    return {'aa':123}@register.simple_tag #自定义标签的标志,接收参数较灵活,没有个数限制def mytag2():    return "<h1>我是自定义标签,我是一个好人</h1>"@register.simple_tagdef mytag3():    # 渲染html标签的时候使用mark_safe进行修饰    return mark_safe("<h1>我是自定义标签,我是一个好人</h1>")@register.simple_tagdef mytag4_sum(x,y):    return x+y
  • 页面

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body><h1>Hello World tagapp</h1>{% load my_tags %}{% mytag %}{% mytag2 %} <!--直接渲染成文本,但是没有渲染出格式-->{% mytag3 %}{% mytag4_sum 2 3 %}</body></html>

    image-20220404142633189

  • 循环列表(可迭代对象)

    from django import templatefrom django.utils.safestring import mark_safe# 实例化对象register=template.Library()@register.inclusion_tag('test.html') #新建一个html写循环语句,或其他操作def mytag5():    return {'li':['11',22,33]}
    {# test.html #}<ul>{% for i in li %}    <li> {{ i }} </li>{% endfor %}</ul>
    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body><h1>Hello World tagapp</h1>{% load my_tags %}{% mytag %}{% mytag2 %} <!--直接渲染成文本,但是没有渲染出格式-->{% mytag3 %}{% mytag4_sum 2 3 %}<h2>列表</h2>{% mytag5 %}{# 主界面上进行引用 #}</body></html>

    image-20220404143025590

3.自定义过滤器

  • 与自定义标签相似只是装饰器不同;

    # 自定义过滤器@register.filterdef myfilter(value):    if value.__len__() > 30:        return '%s......' % value[0:30]    else:        return value
    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body><h1>Hello World tagapp</h1>{{ 'aaaaaaaaaaaabbbbbbbbbbbbb 福建党政培训 www.qhganxun.cn bbccccccccccccsssssssdddf'|myfilter }}<br>{{ 'aaaaaaaaaaaabbbbbbbbbbb'|myfilter }}</body></html>

    image-20220404144433633

4.钩子覆盖

url=[    path('tag/',views.test)]
<!-- base.html --><!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body><h1>我是Base模板</h1>{% block con %}<h1>我是预留的钩子</h1>{% endblock %}</body></html>
{#layout.html #}{% extends 'base.html' %}{% block con %}<H2>哈哈哈</H2>{% endblock %}

image-20220405091913508

说明:继承的模板中的钩子经过继承后会覆盖掉钩子中原有的内容,类似与类继承函数的重写

相同;

5.查找顺序覆盖

在最外层的templats文件夹中,创建layout.html与app中的名字相同;会直接覆盖掉原来的界面。

说明:Html 的查找顺序会按照最外层的templates,之后是配置文件中app注册顺序,到app中templates文件中去找。

image-20220405093719690

本人测试:

{# base.html #}<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body><h1>我是Base模板</h1>{% block con %}<h1>我是预留的钩子</h1>{% endblock %}</body></html>
base2.html{% extends 'base.html' %}{% block tag %}<h3>我是base2中的钩子,继承base.html</h3>{% endblock %}
{% extends  'base2.html' %}{% block  con %} <h3>我是最外层的templates</h3> {% endblock %}{% block  tag %} <h3>继承base2,上一个出现则具备多层继承的关系</h3>{% endblock %}

image-20220405103615758

说明:多层继承存在,但是继承模板后,自己的在定义的钩子模块不在生效。

6.覆盖admin中的钩子

  • 在全局的templates文件下创建admin目录;

  • 创建与adminhtml相同名字的界面;(如:change_list.html

    • 可以观看源码。进入方式可以从配置文件中进行点击。
    • amdin下的templates中存放这所有的界面。
  • 在创建的 Html 文件中,继承原来模版;

  • 使用钩子修改对应的位置,进行扩展定制。

    image-20220405105434385

    {% extends 'admin/base.html' %}{% block content_title %}{% endblock %}
  • 详细请看-参考文章:https://www.cnblogs.com/fungitive/p/9136158.html强力推荐!!

继续努力,终成大器!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值