django模板

Posted wdee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django模板相关的知识,希望对你有一定的参考价值。

djongo模板

 

  • 渲染模板
    • 模板变量传参
    • 模板语句if for..in...
    • 过滤器
  • 模板继承
  • 静态文件加载
  • 模板url反转

 

  Jinja2 flask使用的模板

  DTL (Djiango Template language)带有特殊语法的html文件,这HTML文件可以被Django编译,传递参数

  • #模板路径配置

  settings.py中配置TEMPLATES中的DIRS,如果这里没有配置,djong会从INSTALLED_APPS中安装的项目中寻找templates中的模板文件
‘DIRS‘: [os.path.join(BASE_DIR, ‘templates‘),],

  技术分享图片
TEMPLATES = [
    {
        BACKEND:     django.template.backends.django.DjangoTemplates,
        DIRS: [os.path.join(BASE_DIR,  templates),],
        APP_DIRS: True,
        OPTIONS: {
            context_processors: [
                django.template.context_processors.debug,
                django.template.context_processors.request,
                django.contrib.auth.context_processors.auth,
                django.contrib.messages.context_processors.messages,
            ],
        },
    },
]   
View Code
  • 渲染模板

  1.render_to_string:找到模板后,将模板编译成python字符串,HttpResponse返回字符串。几乎不常用。
  2.render:更加简便的方式,直接将模板渲染成字符串,并包装成HttpResponse对象。

  技术分享图片
‘‘‘
from django.shortcuts import render
from django.template.loader import render_to_string
from django.http import HttpResponse

def t1(request):
html = render_to_string(‘t1.html‘)
return HttpResponse(html)
def t2(request):
return render(request,‘t2.html‘)
‘‘‘
View Code

 

  • #模板变量的使用
def index(request):
    context = {
        list1 : [1,aaa,bbb],
        var1 : aaa,
        dic1:{key1:value1,}
        class1:obj1
    }
    return render(request,index.html,context=context)

‘‘‘模板‘‘‘
{{var1}}
{{list1.0}}
{{dic1.key1}}
{{class1.属性}}

 

1.在模板中使用变量, ‘{{变量}}‘
2.访问对象属性, ‘{{对象.属性}}‘
3.访问一个字典的key对应的vaule,只能通过‘{{字典.key}}‘的方式,不能用‘{{字典[key]}}‘
4.字典不要使用自己本身就有的属性当做key,会导致模板中覆盖原属性
5.如果是列表和元祖,也是通过.的方式,{{list.0}}

  • #模板语句

  所有的标签语句都在‘{% %}‘之间
#if语句

1.语法

{% if 条件 %}
{% elif 条件 %}
{% else %}
{% endif %}

 

2.判定运算符和python一样.
‘== != < <= > >= in not in is is not‘

#for...in...

1.语法

{% for i in 循环对象 %}
...
{% endfor %}

 

如果反向遍历加上‘reversed‘ ,{% for i in 循环对象 reversed %}

遍历字典

{% for key,value in context.items %}
<p>key:{{ key }}</p>
<p>value:{{ value }}</p>
{% endfor %}

 

forloop.counter:当前循环的下标.从1开始
forloop.counter0:当前循环的下标.从0开始
forloop.revcounter:倒叙


2.for...in...empty, 如果这个循环体为空则渲染empty下面的代码

{% for foo in dic %}
....
{% empty %}
<p>empty</p>
{% endfor %}
  • #过滤器

 

有一些数据处理之后才能使用,python中通过函数实现,而模板中通过过滤器实现.过滤器使用|传参.

因为DTL模板语言不支持函数调用的形式 ‘()‘,只能使用过滤器.过滤器就是一个函数,可以对需要处理的参数进行处理,并且还能额外接受一个参数(最多只有两个参数).

add
cut
date

def add_view(request):
    context = {
        list1 : [1,aaa,bbb],
        list2 : [2,ccc],
    }
    return render(request,add.html,context=context)
{{ 1|add:2 }}
<br>
{{ abcd |add:asfasf }}
<br>
{{ list1|add:list2 }}    

def cut_view(request):
    return render(request,cut.html)
{{ "hello world aaa bbb"|cut:" " }}

def date_view(request):
    context = { "nowtime":datetime.now(),}
    return render(request,date.html,context=context)
{{ nowtime|date:"Y-m-d H:i:s " }}
  • #模板继承
技术分享图片
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title><div class="content">{% block head %}{% endblock %}</div>
 </title>
    <style>
        .nav{ overflow: hidden;  }
        .nav li{
            float: left;
            list-style: none;
            margin-top: 30px;
            margin-left: 20px;  }
    </style>
</head>
<body>
<ul class="nav">
    <li><a href="/">首页</a></li>
    <li><a href="{% url ‘book‘ %}">读书</a> </li>
    <li><a href="{% url ‘movie‘ %}">电影</a></li>
    <li><a href="{% url ‘city‘ %}">同城</a></li>
</ul>


<div class="content">{% block content %}
    这是父模板block content中的代码.
{% endblock %}</div>

<div class="footer">
    页脚....
</div>
</body>
</html>
View Code
{% extends base.html %}
{% block head %}
    继承
{% endblock %}

{% block content %}
    这是继承的页面
    {{ block.super }}
{% endblock %}

 

注意:

extends标签必须是第一个标签.

子模板中的代码必须放在block中,否则不会被渲染.

{{ block.super }}引用base模板中{% block content %}中的代码

 

  • #url标签

url反转
<a href="{% url ‘urls中name的值‘ %}">

url中需要传参空格隔开<a href="{% url ‘detail‘ book_id=1 page=2%}">

技术分享图片
‘‘‘-------------urls------------‘‘‘
urlpatterns = [
    path(admin/, admin.site.urls),
    path(‘‘, views.index,name=index),
    path(book/, views.book,name=book),
    path(movie/, views.movie,name=movie),
    path(city/, views.city,name=city),
    path(book/detail/<book_id>, views.detail,name=detail),
    path(login/, views.login,name=login),
]
‘‘‘-------------views------------‘‘‘
from django.template.loader import render_to_string
from django.http import HttpResponse
from django.shortcuts import render

def index(request):
    return render(request,index.html)
def book(request):
    return HttpResponse(book)
def movie(request):
    return HttpResponse(movie)
def city(request):
    return HttpResponse(city)

def detail(request,book_id):
    text = "图书的id是 %s" %book_id
    return HttpResponse(text)

def login(request):
    user_id = request.GET.get(user_id)
    if user_id:
        return  render(request,index.html)
    return HttpResponse(login 页面)

‘‘‘-------------html------------‘‘‘
    
    <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
    <style>
        .nav{
            overflow: hidden;
    }
        .nav li{
            float: left;
            list-style: none;
            margin-top: 30px;
            margin-left: 20px;
        }
    </style>
</head>
<body>
<ul class="nav">
    <li><a href="/">首页</a></li>
    <li><a href="{% url ‘book‘ %}">读书</a> </li>
    <li><a href="{% url ‘movie‘ %}">电影</a></li>
    <li><a href="{% url ‘city‘ %}">同城</a></li>
    <li><a href="{% url ‘detail‘ book_id=1 %}">一本书</a></li>
    <li><a href="{% url ‘login‘ %}?user_id=aaa">登录</a></li>
</ul>
</body>
</html>
View Code

 

 

  • #静态文件加载

可以使用static标签加载,首先需要加载static标签,static跟static文件夹下的静态文件名
{% load static %}
<img src="static logo.jpg">

1.首先确保settings.py中INSTALLED_APPS列表里配置了‘django.contrib.staticfiles‘
INSTALLED_APPS=[ ...,‘django.contrib.staticfiles‘,],Django自动就会生成不删除即可.
2.确保settings.py中STATIC_URL = ‘/static/‘,即这样访问http://ip:port/static/静态文件
3.如果把静态文件都放在项目根目录下的static目录下,settings.py中设置变量
STATICFILES_DIRS = [os.path.join(BASE_DIR, ‘static‘),]
4.也可分散放在各app下,不是很推荐使用
5.static标签不是内置标签,注册static标签后可不用{% load static %}手动加载.
settings.py中TEMPLATES中OPTIONS中添加‘builtins‘:[‘django.templates.static‘]
TEMPLATES = [ ...,‘OPTIONS‘: {...,‘builtins‘:[‘django.templates.static‘],...},...,]

STATIC_URL = /static/
STATICFILES_DIRS = [os.path.join(BASE_DIR,  static),]

 

























以上是关于django模板的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 片段在 Django 模板中不起作用

如何在扩展另一个文件的 django 模板中使用带有动态内容的 html 块片段?

Django模板过滤器 - 一行

如何在Django视图中使用for循环返回每次迭代[关闭]

VSCode自定义代码片段——.vue文件的模板

如何使用引导程序和 for 循环在 django 中创建电影片段?