zoukankan      html  css  js  c++  java
  • 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'),]
  • 相关阅读:
    【C#进阶系列】06 类型和成员基础
    纪中5日T1 1564. 旅游
    纪中17日T1 2321. 方程
    纪中17日T2 2322. capacitor
    纪中10日T1 2313. 动态仙人掌
    纪中14日听课小结 图论 最短路 二分图 差分约束
    一个抓猫的游戏 消遣GAME 持续更新中!
    洛谷P1464 Function  HDU P1579 Function Run Fun
    洛谷P1976 鸡蛋饼
    纪中12日T1 2307. 选择
  • 原文地址:https://www.cnblogs.com/wdee/p/9819932.html
Copyright © 2011-2022 走看看