django学习笔记(二)模板相关

模板学习

2、模板变量

3、常用标签

4、常用过滤器

5、自定义过滤器

6、模板结构

7、加载静态文件


DTL与普通HTML文件区别

DTL模板是一种带有特殊语法的HTML文件,这个文件可以别Django编译

渲染模板:

  1. render_to_string:找到模板,然后将模板编译后渲染成python的字符串格式。最后在通过HttpResponse类包装成一个HttpResponse对象返回回去。示例:                                                                                                                                       html文件快捷键创建                                                                                                                                                                                                                                查看已有的                                                                                                                                                                                                                                                                                                                      下面是模板的使用代码                                                                                                                                                                                                                                                                                                                         

    这里还学习了os.path.dirname()方法的深入学习

    (1)os.path.dirname会去掉一个路径,可以套用

    (2)文件运行的可以用os.path.dirname(__file__)

  2. 直接将模板渲染成字符串和包装成HttpRespose对象一步到位,示例:

  • 模板变量

    (1)模板使用变量,将变量放入’{{}}’中                                                                                                                                                                                                                                                                        

    (2)如果想要访问对象的属性,那么可以通过“对象.属性”          要用person.username去访问                       

    (3)如果想要访问一个字典的key对应的value,只能通过’字典.key’,不能通过 ‘中括号[]’访问,如果想要访问列表或者元组也是通过“.”访问   

     Person.username   去获取 韩芳

     Person.password.0  去获取 123

     Person.password.2  去获取 789                                                                          

    (4)因为在访问字段的key的时候也是使用的‘点’,来访问,因此不能再字段中定义字典本身就有的属性名当做 ‘key’

  • 常用标签
  1. if标签

    (1)所有的标签都是在‘{%%}’之间

    (2)If标签有闭合标签。{%endif%}

    (3)If 标签的判断运算符,和python中判断运算符一样,‘==、!=、<、<=、>、>=、  in、not in、is、is not’都可以使用

    (4)还可以使用else和elif标签。

    代码实例:Views.py

    from django.http import  HttpResponse
    from django.shortcuts import render
    
    
    def index(request):
       # context = {
       #    "age": 18
       # }
    
       context = {
          'heros':['鲁班一号',
                   '项羽',
                   '程咬金']
       }
       return render(request,"index.html",context=context)
    

    Index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    {#      {% if age1 < 18 %}#}
    {#          <p>您是未成年人不能进入网吧</p>#}
    {#      {% elif age == 18 %}#}
    {#          <p>您是成年人,可以进入网吧</p>#}
    {#      {% else %}#}
    {#          <p>您成年了,需要担负家庭责任,不能进入网吧</p>#}
    {#      {% endif %}#}
    {% if '鲁班一号' in heros %}
        <p>鲁班一号在工作</p>
    {% else %}
        <p>鲁班一号在睡觉</p>
    {% endif %}
    </body>
    </html>
    
     
  2. for标签

    (1)ul标签是无序标签

    (2)for…in…标签    可以遍历列表、元组、字符串、字典等一切可以遍历的对象(集合有点特殊)

    (3)在for循环中,DTL提供了一些变量使用

     forloop.counter 当前循环的下标,从1开始

     forloop.counter0当前循环的下标,从0开始

     forloop.revcounter当前循环的反向下标

    forloop.first   是否是第一次遍历

    forloop.last    是否是最后一次遍历

    forloop.parentloop  上一级的for循环

    (4)For…in…empty  如果遍历的内容为空时,会走empty的代码

    (5)遇到一个报错检查出原因记录下:需要是dict类型,包{}换成[]就好了

    def index(request):
       context= {
          'books':[
             {
                'name':'水浒传',
                'author':'施耐庵',
                'price':109
             },
             {
                'name': '西游记',
                'author': '吴承恩',
                'price': 299
             },
             {
                'name': '红楼梦',
                'author': '曹雪芹',
                'price': 399
             },
             {
                'name': '三国演义',
                'author': '罗贯中',
                'price': 199
             }
          ],
          'person':{
             'name':'zuotian',
             'height':180,
             'great':23
          },
          'comments':[
          ],
          'mystrings':"mystring",
          'mylists':[[12,13,14],[15,16,17]],
          #'mylists': [1, 2, 3],
          'mydicts':{'1':1,'2':2},
          #'mysets':{{'1':1},{"2":2}},集合里面的元素是list、dict的话是不能遍历的,嵌套遍历也解决不了
          #'mysets': {[1,2],[4,6]},
          'mysets': {"dsf",'wer'},
          'mytuples':(1,2,3)
       }
       return render(request,"index.html",context=context)
    
    index.html内容
    <ul>
        {% for key in person.keys %}
            <li>{{ key }}</li>
        {% endfor %}
    </ul>
    <ul>
        {% for key,value in person.items %}
            <li>{{ key }}:{{ value }}</li>
        {% endfor %}
    </ul>
    <table>
        <thead>
            <tr>
                <td>序号从1开始</td>
                <td>序号从0开始</td>
                <td>序号反向</td>
                <td>书名</td>
                <td>作者</td>
                <td>价格</td>
            </tr>
        </thead>
        <tboby>
            {% for book in books %}
                {% if forloop.first %}
                    <tr style="background: pink">
                {% elif forloop.last %}
                    <tr style="background: aqua">
                {% else %}
                    <tr>
                {% endif %}
                    <td>{{ forloop.counter }}</td>
                    <td>{{ forloop.counter0 }}</td>
                    <td>{{ forloop.revcounter }}</td>
                    <td>{{ book.name }}</td>
                    <td>{{ book.author }}</td>
                    <td>{{ book.price }}</td>
                </tr>
            {% endfor %}
        </tboby>
    </table>
    
    <ul>
        {% for comment in comments %}
            <li>{{ comment }}</li>
        {% empty %}
            <li>什么也没有的情况</li>
        {% endfor %}
    
    </ul>
    
    <ul>
        <p>mystring</p>
        {% for mystring in mystrings %}
            <li>{{ mystring }}</li>
        {% endfor %}
        <p>mylist</p>
        {% for mylist in mylists %}
            {% for i in mylist %}
                <li>{{ forloop.parentloop.counter }}</li>
            {% endfor %}
        {% endfor %}
        <p>mydicts</p>
        {% for mydict in mydicts %}
            <li>{{ mydict }}</li>
        {% endfor %}
        <p>mysets</p>
        {% for myset in mysets %}
            <li>{{ myset }}</li>
        {% endfor %}
        <p>mytuples</p>
        {% for mytuple in mytuples %}
            <li>{{ mytuple }}</li>
        {% endfor %}
    
    </ul>
    
  3. with标签

    (1)作用:在模板中创建变量

    (2)两种方式:with xx=xxx的形式(等号两边不能有空格),with xxx as xx的形式

    (3)定义的变量只能在with语句块中使用,在with语句块外使用取不到这个变量

    代码实例:

    def index(request):
      	 context = {
          		'heros':['鲁班一号',
                		   '项羽',
                  		 '程咬金']
       	}
    	return render(request,"index.html",context=context)
    
    index.html
    {% with hf=heros.0 %}
        <p>{{ hf }}</p>
    {% endwith %}
    {% with heros.0 as hf %}
        <p>{{ hf }}</p>
    {% endwith %}
    

     

  4. autoescape标签

    (1)spaceless标签:移除html标签中的空白字符,包括空格、tab、换行等,但是不会移除标签和文本之间的空白字符。

    实例1:

    {% spaceless %}
        <p>
            <a href="foo/">foo</a>
        </p>    
    {% endspaceless %}
    查看网页源码,会渲染为:
    <p><a href="foo/">foo</a></p>
    实例2:
    {% spaceless %}
        <strong>
            hello
        </strong>
    {% endspaceless %}
    查看网页源码,会渲染为:
    

    (2)作用:自动转义功能的开启和关闭,模板默认是开启状态

    (3)如果你不知道自己在干什么,最好使用DTL的自动转义,这样网站不容易出现xss漏洞

    实例:

    Views.py中
    def index(request):
    context = {
       'info':"<a href='www.baidu.com'>百度</a>"
    }
    return render(request,"index.html",context = context)
    
    {{ info }}
    <a href='www.baidu.com'>百度</a>
    

    网页中渲染:                                                                                                                                                                                                                                                                                                                          

    实例2:

    修改index.html

    {% autoescape off %}
        {{ info }}
    {% endautoescape %}
    <a href='www.baidu.com'>百度</a>
    

                 

  5. url标签

    (1)在模板中,我们经常要写一些url,比如某个a标签定义href属性,当然如果通过硬编码的方式直接将这个url写死在里面也是可以的。但是这样对于以后项目维护可能不是一件好事。因此建议使用这种反转的方式来实现,类似与django中的reverse一样。

    (2)如果url反转的时候需要传递参数,分位置参数、关键字参数,不能同时使用

    (3)如果url标签反转的时候要传递查询字符串的参数,需要手动添加,多个参数空格分隔

    例子:

    def login(request):
       next = request.GET.get('next')
       text = '登录页面,登录完成跳转的页面的url是:%s' % next
       return  HttpResponse(text)
    
    def book(request):
       return HttpResponse("读书页面")
    
    def book_detail(request,book_id,categroy="分类"):
       text = "你的图书 id:%s,分类是:%s" % (book_id,categroy)
       return HttpResponse(text)
    
    def movie(request):
       return HttpResponse("电影页面")
    
    def city(request):
       return HttpResponse("同城页面")
    
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .nav{
                overflow: hidden;
            }
            .nav li{
                float: left;
                list-style: none;
                margin: 0 20px;
            }
        </style>
    </head>
    
        <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="/city/">同城</a></li>
    {#        <li><a href="{% url 'detail' '23' %}">最火的一片文章</a></li>#}
            <li><a href="{% url 'detail' book_id='23' categroy="我也不到是啥" %}">最火的一片文章</a></li>
            <li><a href="{% url 'detail_noCategroy' book_id='33'  %}">最火</a></li>
            <li><a href="{% url 'login' %}?next=/">登录</a></li>
        </ul>
    

    区分app时使用应用命名空间                                                                                                                                                                                                                                                                           

  6. verbatim标

    (1)作用:解析特殊字符,使用场景有,多个模板混合情况

    示例:index.html
    {% verbatim %}
        {{ hello }}
    {% endverbatim %}
    

    浏览器效果:                                                                                                                                                                                                                                                    

 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值