zoukankan      html  css  js  c++  java
  • Python:Day53 Template基础

    一、模板由 html代码+逻辑控制代码 组成

    二、逻辑控制代码的组成

    1、变量(使用双大括号来引用变量)

      语法格式:{{ var_name }}

    -----------------------Template和Context对象

    (venv) C:UsersLowryPycharmProjectsdjango_template>python manage.py shell
    >>> from django.template import Context,Template
    >>> t=Template("my name is {{name}}")    #逻辑控制代码一定要写在引号里面
    >>> c=Context({'name':"alex"})
    >>> t.render(c)
    'my name is alex'
    
    #同一模板多个上下文
    1、多次创建模板
    >>> for name in ("john","julie","pat"):
    ...     t=Template("hello,{{name}}")    #缩进必须要有
    ...     print(t.render(Context({"name":name})))
    ...
    hello,john
    hello,julie
    hello,pat
    
    2、一次创建多次渲染
    >>> t=Template("my name is {{name}}")
    >>> for name in ("john","alex","kobe"):
    ...     print(t.render(Context({"name":name})))
    ...
    my name is john
    my name is alex
    my name is kobe

    ----------------------------万能句点号,用于特殊变量的取值。点后面接的是对象的属性,这个要和filter的方法区分开。

    -----------------------views
    import datetime
    
    def index(request):
        obj="alex"
        s=[111,222,333,"alex"]
        s1={"username":"alex","age":18}
        s2=datetime.datetime.now()
    
        class person():
            def __init__(self,a,b):
                self.name=a
                self.age=b
        s3=person("yuan",18)
    
        return render(request,"index.html",{"name":s3})
    
    -------------------------index.html
    {#{{ name }}#}
    {#{{ name.username }}#}
    {{ name.name }}
    {{ name.age }}

    2、{% if %}的使用

    {% if True %}   //if后面接的是表示True或False的对象,可以是Ture或False,也可以是字符串、数字,但字符串必须要加引号,如果不加引号解释器会认为是变量。
        <p>hello world</p>
    {% elif obj %}  //这个obj在这里是变量,对应视图函数中render返回中的第三个参数
        <p>hello 2</p>
    {% endif %}

    3、{% for %}的使用

    ----------------------views
    
    def index(request):
        s=[111,222,333,"alex"]
    
        return render(request,"index.html",{"obj":s})
    
    ----------------------index.html
    
    {% for i in obj %}
        <p>{{ forloop.counter }}:{{ i }}</p>    //结果:1:111 2:222 3:333 4:alex
        <p>{{ forloop.counter0 }}:{{ i }}</p>   //结果:0:111 1:222 2:333 3:alex
        <p>{{ forloop.revcounter }}:{{ i }}</p>     //结果:4:111 3:222 2:333 1:alex
        <p>{{ forloop.revcounter0 }}:{{ i }}</p>   //结果:3:111 2:222 1:333 0:alex
    {% endfor %}

    4、filter的使用

    语法格式:      {{obj|filter:param}}

    filter其实是上模板语言提供的方法,它是将前面的一个对象传到后面的方法中,有参数的在过滤器后面加冒号,然后加参数,处理过后再返回值,虽然有很多方法和python很像,但是不是python的,不要搞混。

    ---------------------views
    
    def index(request):
        ret="alex"
    
        return render(request,"index.html",{"obj":ret})
    
    ---------------------index.html
    
    {{ obj|upper }} //ALEX
    {{ obj|lower }} //alex
    {{ obj|first }} //a
    {{ obj|first|upper }}  //A 
    {{ obj|capfirst }}  //Alex

    add过滤器

    ---------------------------views
    
    def index(request):
        s4=6
        return render(request,"index.html",{"obj":s4})
    
    ---------------------------index.html
    
    {{ obj|add:5 }}     //结果:11

    cut过滤器

    --------------------------views
    
    def index(request):
        s5="hello world"
        return render(request,"index.html",{"obj":s5})
    
    --------------------------index.html
    
    {{ obj|cut:"or" }}     //结果:hello wld,如果cut的是字符串,要记得加上引号

    date过滤器

    --------------------------views
    
    def index(request):
        s2=datetime.datetime.now()
        return render(request,"index.html",{"obj":s2})
    
    --------------------------index.html
    
    {{ obj|date:"y-m-d" }}  //18-05-08,后面的格式要用引号引起来
    {{ obj|date:"Y-m-d" }}  //2018-05-08

    default过滤器:如果值是False就替换成设置的默认值,否则就是用本来的值

    -----------------------------------views
    
    def index(request):
        s6=[]
        return render(request,"index.html",{"obj":s6})
    
    -----------------------------------index.html
    
    {{ obj|default:"空的" }}

    {% autoescape off%}:注意这里是加在{% %}中的

    #没加之前的效果
    --------------------------------views
    
    def index(request):
        s7="<a href='#'></a>"
        return render(request,"index.html",{"obj":s6})
    
    --------------------------------index.html
    
    {{ obj }}    //<a href='#'>跳转</a>
    
    
    #加过之后的效果
    --------------------------------views
    
    def index(request):
        s7="<a href='#'></a>"
        return render(request,"index.html",{"obj":s6})
    
    --------------------------------index.html
    
    {% autoescape off %}
    {{ obj }}       //跳转
    {% endautoescape %}

    safe过滤器:和上面起到的效果一样,都是让浏览器去渲染这个标签

    --------------------------------views
    
    def index(request):
        s7="<a href='#'></a>"
        return render(request,"index.html",{"obj":s6})
    
    --------------------------------index.html
    
    {{ obj|safe }}    //跳转

    其它过滤器:

    -----------------------views
    
    def index(request):
        s5="hello world"
        return render(request,"index.html",{"obj":s5})
    
    -----------------------index.html
    
    {{ obj|filesizeformat }}    //0 bytes,为什么是0?
    {{ obj|length }}    //11
    {{ obj|slice:":-1" }}   //hello worl

    {% csrf_token %}:csrf_token标签

    用于生成csrf_token的标签(其实就是一个input标签),用于防治跨站攻击验证。这个Input标签是隐藏的,名字为:csrfmiddlewaretoken,value是一堆字符串。

    -------------------------------------views
    
    def login(request):
        if request.method=="POST":
            return HttpResponse("登陆成功")
        return render(request,"login.html")
    
    -------------------------------------index.html
    
    <form action="/login" method="post">
        <p>姓名:<input type="text" name="username"></p>
        <p>密码:<input type="text" name="password"></p>
        <input type="submit">
        {% csrf_token %}
    </form>

    这里有一点需要注意的,这个方法只适用于render,对于render_to_response不适用,如果想使用需要额外加命令。

    {% url %}

    --------------------------------urls
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('login', views.login,name="abc"),
    ]
    
    --------------------------------views
    
    def login(request):
        if request.method=="POST":
            return HttpResponse("登陆成功")
        return render(request,"login.html")
    
    --------------------------------login.html
    
    <form action="{% url "abc" %}" method="post">
        <p>姓名:<input type="text" name="username"></p>
        <p>密码:<input type="text" name="password"></p>
        <input type="submit">
        {% csrf_token %}
    </form>

    {% verbatim %}:不进行render渲染

    {% verbatim %}
    {{ obj }}
    {% endverbatim %}

    {% load %}:在HTML文件中加载自定义的simple_tag和filter时用的。

    自定义simple_tag和filter

    1、在app中创建templatetags文件夹或包

    2、在templatetags中创建.py文件

    from django import template
    from django.utils.safestring import mark_safe
    
    register = template.Library()   #register的名字是固定的,不可改变
    
    @register.simple_tag
    def myadd(v1):
        return v1+1001
    
    @register.filter
    def myplus(v1,v2):
        return v1+v2

    3、在HTML文件中引入py文件,然后进行调用

    {% load my_tags %}    可以在HTML最上面,可以不在
    
    {% myadd 1 %}    #simple_tag用{% %}包着
    
    {{ num|myplus:12 }}    #filter和其它自带filter一样都是用{{ }}包着

    4、一定要在settings中的INSTALL_APPS配置当前app,不然Django无法找到文件

    注意:filter中最多只能有两个参数,而simple_tag中可以多个,但是simple_tag不能用在for或if后面,而filter可以

    {% if num|myplus:20 > 100 %}
        <h1>大于100 </h1>
    {% endif %}
  • 相关阅读:
    学电脑入门与提高
    Autodesk Revit Architecture 2014官方标准教程
    Photoshop移动UI界面设计实用教程 全彩超值版
    中文版SQL Server 2000开发与管理应用实例
    Excel2016数据处理与分析从新手到高手
    云计算(第三版)
    无线局域网搭建与管理
    R语言数据挖掘
    Spring 3.0就这么简单
    SVN使用教程总结
  • 原文地址:https://www.cnblogs.com/sq5288/p/9000921.html
Copyright © 2011-2022 走看看