django-基础-模板
模板
官方:https://docs.djangoproject.com/en/1.9/ref/templates/builtins/
基本步骤
前面用django.http.HttpResponse显示内容,现在用渲染方法显示
再回顾一次配置流程:
创建project、app
在learn/views.py中添加视图
所谓视图就是一个函数
from django.shortcuts import render
 
def home(request):
    return render(request, 'home.html')
在learn目录下创建templates,里面设置home.html;
模板系统会自动找到app/templates下的html模板,在html模板中添加一些内容;
然后将视图函数对应到网址,修改zqxt_tmpl/urls.py
from django.conf.urls import include, url
from django.contrib import admin
from learn import views as learn_views
 
urlpatterns = [
    url(r'^$', learn_views.home, name='home'),
    url(r'^admin/', admin.site.urls),
]
创建数据库表
python manage.py migrate
网站模板的设计
先做一些通用的设计导航,底部,访问统计代码
nav.html, bottom.html, tongji.html
写一个base.html包含这些通用文件include
<!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>
include 是包含其它文件的内容,就是把一些网页共用的部分拿出来,重复利用,改动的时候也方便一些
还可以把广告代码放在一个单独的html中,改动也方便一些,在用到的地方include进去。
其它的页面继承自 base.html 就好了,继承后的模板也可以在 block 块中 include 其它的模板文件。
比如我们的首页home.html,继承或者扩展原来的base.html
{% extends 'base.html' %}
 
{% block title %}欢迎光临首页{% endblock %}
 
{% block content %}
{% include 'ad.html' %}
这里是首页,欢迎光临
{% endblock %}
Django 模板查找机制
在每个app的templates文件夹中找,而不是只在当前app下;
全部的templates形成一个列表,Django会遍历整个列表,找到就停止,所有的文件都遍历后还找不到就返回Template Not Found
好处是一个app可以使用另一个app的模板,坏处是容易找错;我们在使用的时候templates中建立一个app同名的文件夹;
这样把app的文档放在app/templates/app/下面
例如:项目 zqxt 有两个 app,分别为 tutorial 和 tryit
zqxt
├── tutorial
│   ├── __init__.py
│   ├── admin.py
│   ├── models.py
│   ├── templates
│   │   └── tutorial
│   │       ├── index.html
│   │       └── search.html
│   ├── tests.py
│   └── views.py
├── tryit
│   ├── __init__.py
│   ├── admin.py
│   ├── models.py
│   ├── templates
│   │   └── tryit
│   │       ├── index.html
│   │       └── poll.html
│   ├── tests.py
│   └── views.py
├── manage.py
└── zqxt
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py
使用的时候用tutorial/index.html和tryit/index.html就不会混淆;
模板进阶
- 列表,字典,类的实例的使用
- 循环:迭代显示列表,字典等中的内容
- 条件判断:判断是否显示该内容,比如判断是手机访问,还是电脑访问,给出不一样的代码。
- 标签:for,if 这样的功能都是标签。
- 过滤器:管道符号后面的功能,比如{{ var|length }},求变量长度的 length 就是一个过滤器。
上下文渲染器
如果需要将一个或多个变量共享给多个网页或者所有网页使用,比如在网页上显示来访者的IP,可以使用上下文渲染器;
例子:显示一个基本的字符串在网页上
views.py
# -*- coding: utf-8 -*-
from django.shortcuts import render
 
def home(request):
    string = u"我在自强学堂学习Django,用它来建网站"
    return render(request, 'home.html', {'string': string})
在视图中我们传递了一个字符串名称是 string 到模板 home.html,在模板中这样使用它:
for 循环 和 List内容的显示
views.py
def home(request):
    TutorialList = ["HTML", "CSS", "jQuery", "Python", "Django"]
    return render(request, 'home.html', {'TutorialList': TutorialList})
view中传递了一个List到home.html模板中
home.html
{% for i in TutorialList %}
{{ i }}
{% endfor %}
变量使用:{{ }}
功能使用:{%  %}
字典
views.py
def home(request):
    info_dict = {'site': u'我的站点', 'content': u'站点内容'}
    return render(request, 'home.html', {'info_dict': info_dict})
home.html
站点:{{ info_dict.site }} 内容:{{ info_dict.content }}
注意在模板中使用的是info_dict.site
字典遍历
{% for key, value in info_dict.items %}
    {{ key }}: {{ value }}
{% endfor %}
if和for
def home(request):
    List = map(str, range(100))# 一个长度为100的 List
    return render(request, 'home.html', {'List': List})
home.html
{% for item in List %}
    {{ item }}, 
{% endfor %}
为了不在最后一个上添加逗号
{% 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>
模板上得到url
# 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 %}
这样url为/add/4/5/,修改实际的url只需要修改正则表达式,不需要修改name值
as将内容取别名
{% url 'some-url-name' arg arg2 as the_url %}
<a href="{{ the_url }}">链接到:{{ the_url }}</a>
逻辑操作
==, !=, >=, <=, >, <用法
{% if var >= 90 %}
成绩优秀,自强学堂你没少去吧!学得不错
{% elif var >= 80 %}
成绩良好
{% elif var >= 70 %}
成绩一般
{% elif var >= 60 %}
需要努力
{% else %}
不及格啊,大哥!多去自强学堂学习啊!
{% endif %}
and, or, not, in, not in用法
{% if num <= 100 and num >= 0 %}
num在0到100之间
{% else %}
数值不在范围之内!
{% endif %}
判断ziqiangxuetang是否在list中
{% if 'ziqiangxuetang' in List %}
自强学堂在名单中
{% endif %}
获取当前url、用户
views.py中如果没有使用render函数,使用render_to_response,需要加入上下文渲染器
修改settings.py需要添加内容,但是这样是不推荐的
http://www.ziqiangxuetang.com/django/django-template2.html
当前用户:{{ 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>
 
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号