Django基础(二):templates

[TOC]

模板搜索机制

模板存放位置

  • 每个app的templates文件夹
  • settings.py参数TEMPLATES/DIRS设置路径
    Django会自动去这两类文件夹中寻找模板。

但是,假如每个app的templates或者TEMPLATES定义路径中都有一个 index.html,
当在views.py中使用index.html模板时,直接写一个 render(request, 'index.html'),
或者当某个模板引用这个index.html模板时,直接写{% include/extends 'index.html' %},
Django 能不能找到想要的那个index.html呢?(答案是不一定能,有可能找错)

Django 模板查找机制:
Django 查找模板的过程是在每个 app 的 templates 文件夹中找(而不只是当前 app 中的代码只在当前的 app 的 templates 文件夹中找)。各个 app 的 templates 形成一个文件夹列表,Django 遍历这个列表,一个个文件夹进行查找,当在某一个文件夹找到的时候就停止,所有的都遍历完了还找不到指定的模板的时候就是 Template Not Found (过程类似于Python找包)。这样设计有利当然也有弊,有利是的地方是一个app可以用另一个app的模板文件,弊是有可能会找错了。

所以我们使用的时候在 templates 中建立一个 app 同名的文件夹,仅和该app相关的模板放在 app/templates/app/ 目录下面,这样,使用的时候,views templates引用模板就是"app1/index.html" 和 "app2/index.html" 这样有app作为名称的一部分,就不会混淆。

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',
            ],
        },
    },
]

如果需要,写足够多的 block 以便继承的模板可以重写该部分,include 是包含其它文件的内容,就是把一些网页共用的部分拿出来,重复利用,改动的时候也方便一些,还可以把广告代码放在一个单独的html中,改动也方便一些,在用到的地方include进去。其它的页面继承自 base.html 就好了,继承后的模板也可以在 block 块中 include 其它的模板文件。

demo

# suynblog/learn/views.py
def home(request):
    return render(request,'learn/home.html')
# suynblog/learn/urls.py
(r'^home/$',views.home,name='home'),

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

# suynblog/learn/templates/home.html
{% extends 'learn/base.html' %}
{% block title %}欢迎光临首页{% endblock %}
{% block content %}
这里是首页,欢迎光临!<br/>
{% include 'add.html' %}
{% endblock %}

变量

一般的变量之类的用 {{ }}(变量)
字符串、列表、字典

# views.py
def home(request):
    string = u"我在自强学堂学习Django,用它来建网站"
    TutorialList = ["HTML", "CSS", "jQuery", "Python", "Django"]
    info_dict = {'site': u'自强学堂', 'content': u'各种IT技术教程'}
    return render(request,'learn/home.html',
    {'string': string,'TutorialList': TutorialList,'info_dict': info_dict})

# home.html
{{ string }}
<br>
{% for i in TutorialList %}
{{ i }}
{% endfor %}
<br>
站点:{{ info_dict.site }} 内容:{{ info_dict.content }}<br>
{% for key, value in info_dict.items %}
    {{ key }}: {{ value }}
{% endfor %}

标签

功能类的,比如循环,条件判断是用 {% %}(标签)

1. if-elif-else-endif标签

模板中逻辑操作
==, !=, >=, <=, >, <,
and, or, not, in, not in

2. for-endfor标签

# views.py
List = map(str,range(100))  #int unicode str
# home.py
{% for item in List %}
    {{ item }}
    {% if not forloop.last %}
    ,
    {% endif %}
{% endfor %}

for循环中变量forloop有很多有用的属性:
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>

模板上得到对应视图网址:

# add.html
<a href="{% url 'learn:add3' a=4 b=5 %}">add3计算4+5</a><br/>

还可以使用 as 语句将内容取别名(相当于定义一个变量),多次使用(但视图名称到网址转换只进行了一次)

# add.html
{% url 'learn:add3' a=4 b=5 as add_url %}
<a href="{{ add_url }}">add3计算4+5</a><br/>

模板中获取当前网址,当前用户等:

如果在 views.py 中用的是render_to_response函数,不是render函数时,需要将 request 加入到上下文渲染器。

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',
            ],
        },
    },
]

根据'django.template.context_processors.request',在模板中我们就可以用request变量了。一般推荐用render而不是render_to_response。

  • 获取当前用户
{{ request.user }}
# 如果登陆就显示内容,不登陆就不显示内容:
{% if request.user.is_authenticated %}
    {{ request.user.username }},您好!
{% else %}
    请登陆,这里放登陆链接
{% endif %}
  • 获取当前网址及GET参数
{{ request.path }}
{{ request.GET.urlencode }}
#判断 delete 参数是不是 1 来删除当前的页面内容
<a href="{{ request.path }}?{{ request.GET.urlencode }}&delete=1">当前网址加参数 delete</a>

过滤器

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容