django - 模板(templates)和 使用

Django - templates(模板)


1. 简介

templates 的中文意思就是模板, 在django项目中该文件夹下是专门存放html文件的, 每一个html文件就是一个模板。模板是用来显示网页用的,在views.py文件中我们可以定义使用模板的方法。下面就来写一些干货。


2. 模板中循环、条件判断、常用标签、过滤器的使用

循环: 迭代显示列表、字典等中的内容
条件判断:判断是否显示该内容
标签:for, if这样的功能都是标签
过滤器: 管道后面的功能。,比如{{var|length}},求变量长度的length就是一个过滤器

  1. 字符串传入模板:

        def home(request):
        string = "我在学习Django"
        return render(request, 'home.html', {'string': string})
    
    
        在模板中这样使用方式:
    
        {{ string }}
    
  2. for循环和list:

    def home(request):
        TutorialList = ["HTML", "CSS", "jQuery", "Python", "Django"]
        return render(request, 'home.html', {'TutorialList': TutorialList})
    
    
     在模板中使用方式:
    
        {% for i in TutorialList %}
            {{ i }}
        {% endfor %}
    
  3. 字典传入模板:

    def home(request):
        info_dict = {'site': '自强学堂', 'content': '各种IT技术教程'}
        return render(request, 'home.html', {'info_dict': info_dict})
    
    在模板中使用使用:
    
        {{ info_dict.site }}
        {{ info_dict.content }}
    
    在模板中取字典的键是用点info_dict.site,而不是
    Python中的 info_dict['site']
    
    遍历字典:
    
        {% for key, value in info_dict.items %}
        {{ key }}: {{ value }}
        {% endfor %}
    
  4. 条件判断和for循环的详细操作:

    def home(request):
    List = map(str, range(100))# 一个长度为100的 List
    
    假如我们想用逗号将这些元素连接起来:
    
        {% for item in List %}
            {{ item }}, 
        {% endfor %}
    
    但是最后一个元素后面也有一个逗号,这样肯定不爽,
    如果判断是不是遍历到了最后一个元素了呢?
    
    用变量 forloop.last 这个变量,如果是最后一项其为真,否则为假,更改如下:
    
        {% for item in List %}
            {{ item }}
            {% if not forloop.last %}
                ,
            {% endif %} 
        {% endfor %}
    
    在for循环中还有很多有用的东西,如下:
    
        forloop.counter 索引从 1 开始算
        forloop.counter0    索引从 0 开始算
        forloop.revcounter  索引从最大长度到 1
        forloop.revcounter0 索引从最大长度到 0
        forloop.first   当遍历的元素为第一项时为真
        forloop.last    当遍历的元素为最后一项时为真
        forloop.parentloop  用在嵌套的 for 循环中,获取上一层 for 
        循环的 forloop
    
        当列表中可能有个元素为空值时用 for  empty
    
            <ul>
            {% for athlete in athlete_list %}
                <li>{{ athlete.name }}</li>
            {% empty %}
                <li>抱歉,列表为空</li>
            {% endfor %}
            </ul>
    
  5. 模板上得到对应视图的网址:

    # views.py
    def add(request, a, b):
        c = int(a) + int(b)
        return HttpResponse(str(c))
    
    
    # urls.py
    urlpatterns = patterns('',
        url(r'^add/(\d+)/(\d+)/$', 'app.views.add', name='add'),
    )
    
    
    # template html
    {% url 'add' 4 5 %}
    
    这样网址上就会显示出:/add/4/5/ 这个网址,假如我们以后
    修改 urls.py 中的 :
    
        r'^add/(\d+)/(\d+)/$'
        这一部分,改成另的,比如:
    
        r'^jiafa/(\d+)/(\d+)/$'
        这样,我们不需要再次修改模板,当再次访问的时候,
        网址会自动变成 /jiafa/4/5/
    
    
    还可以使用 as 语句将内容取别名(相当于定义一个变量),
    多次使用(但视图名称到网址转换只进行了一次)
    
        {% url 'some-url-name' arg arg2 as the_url %}
    
        <a href="{{ the_url }}">链接到:{{ the_url }}</a>
    
  6. 模板中的逻辑操作:

    ==, !=, >=, <=, >, < 这些比较都可以在模板中使用,比如:
    
    
        {% if var >= 90 %}
        成绩优秀,自强学堂你没少去吧!学得不错
        {% elif var >= 80 %}
        成绩良好
        {% elif var >= 70 %}
        成绩一般
        {% elif var >= 60 %}
        需要努力
        {% else %}
        不及格啊,大哥!多去自强学堂学习啊!
        {% endif %}
    
    比较符号前后必须有至少一个空格!)
    
    and, or, not, in, not in 也可以在模板中使用:
    
        假如我们判断 num 是不是在 0 到 100 之间:
    
        {% if num <= 100 and num >= 0 %}
            num在0到100之间
        {% else %}
            数值不在范围之内!
        {% endif %}
            假如我们判断 'ziqiangxuetang' 在不在一个列表变量 List 中:
    
        {% if 'ziqiangxuetang' in List %}
        自强学堂在名单中
        {% endif %}
    
  7. 模板中 获取当前网址,当前用户等:

    修改 settings.py 
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    ...
                    'django.template.context_processors.request',
                    ...
                ],
            },
        },
    ]   
    
    然后在 模板中我们就可以用 request 了
    
    
    获取当前用户:
    
        {{ request.user }}
    
    如果登陆就显示内容,不登陆就不显示内容:
    
        {% if request.user.is_authenticated %}
            {{ request.user.username }},您好!
        {% else %}
            请登陆,这里放登陆链接
        {% endif %}
    
    获取当前网址:
    
        {{ request.path }}
    
    获取当前 GET 参数:
    
        {{ request.GET.urlencode }}
    
    合并到一起用的一个例子:
    
        <a href="{{ request.path }}?{{ request.GET.urlencode }}
        &delete=1">当前网址加参数 delete</a>
    我们可以判断 delete 参数是不是 1 来删除当前的页面内容。
    

    简单总结下:一般变量之类的用{{}}(变量),功能类的, 比如循环,条件判断使用{% %}(标签)

  8. 过滤器

    1. date

      年: y  两位年  Y 四位年
      月: m
      日: d
      
      时:h 12小时制  H 24小时制
      分:m
      秒:s
      
    2. 注释

      {#  #}      模板中单行注释
      
      {% comment %}  {% endcomment %}   模板中多行注释
      
    3. 大小写

      upper  lower
      
    4. 乘或者除

      widthratio 数 分母  分子
      
    5. 整除2,返回True,反之False

      divisibleby:2
      
    6. namespace和name使用

      {% url 'namespace:name' value1 %}
      工程url中定义namespace
      模块appurl中定义name
      

3. include(包含)和 extends(拓展或者继承)


网站模板的设计,一般都会有一些通用的部分,像导航,底部,访问统计代码等。

nav.html, bottom.html, tongji.html

  • 包含(include):

    base.html包含 nav.html, bottom.html, tongji.html

  • 继承(extends):

    nav.html, bottom.html, tongji.html 继承 base.html

    挖坑:

    base.html:
    <!DOCTYPE html>
    <html>
    <head>
    <title>{% block title %}默认标题{% endblock %}</title>
    </head>
    <body>
    
    {% include 'nav.html' %}
    
    {% block content %}
    <div>这里是默认内容,所有继承自这个模板的,如果不覆盖
    就显示这里的默认内容。</div>
    
    {% endblock %}
    
    {% include 'bottom.html' %}
    
    {% include 'tongji.html' %}
    
    </body>
    </html>
    

    填坑:

    nav.html:
    把原有的html格式删除,然后内容为  
    
    {% block title %}
        文本内容
    {% endblock %}
    
    {% block contains %}
        文本内容
    {% endblock %}
    

    包含与继承(extends):形式刚好相反

    Django 模板查找机制: Django 查找模板的过程是在每个 app 的 templates 文件夹中找(而不只是当前 app 中的代码只在当前的 app 的 templates 文件夹中找)。各个 app 的 templates 形成一个文件夹列表,Django 遍历这个列表,一个个文件夹进行查找,当在某一个文件夹找到的时候就停止

猜你喜欢

转载自blog.csdn.net/hello_syt_2018/article/details/80098806