• 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'),]
  • 相关阅读:
    44-Floyd 算法
    43-Kruskal 算法
    42-MST & Prim 算法
    -垂直(水平)导航栏--转换-过度-动画-多列-瀑布流-事件
    css- 列表-表格table-轮廓-定位-浮动-盒子模型
    JS中[object object]怎么取值
    css- 选择器-背景--文本--字体--链接
    html-时间datetime-获取焦点autofocus-提示required-验证labels-默认值control-可编辑下拉-正则
    ---html链接-表格table-列表ul-布局div-表单form-input属性-多层嵌套的跳转-实体H5-新增属性
    html--块
  • 原文地址:https://www.cnblogs.com/wdee/p/9819932.html
Copyright © 2020-2023  润新知