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'),]

 

posted @ 2018-10-20 12:24  来看看博客  阅读(160)  评论(0编辑  收藏  举报