码迷,mamicode.com
首页 > 其他好文 > 详细

django模板

时间:2018-10-20 12:57:35      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:super   files   访问   hid   dmi   不用   context   empty   debug   

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模板

标签:super   files   访问   hid   dmi   不用   context   empty   debug   

原文地址:https://www.cnblogs.com/wdee/p/9819932.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!