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‘, ], }, }, ]
- 渲染模板
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‘) ‘‘‘
- #模板变量的使用
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>
{% 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>
- #静态文件加载
可以使用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模板的主要内容,如果未能解决你的问题,请参考以下文章