最新消息:欢迎光临 魔力 • Python!大家可以点开导航菜单中的【学习目录】,这个目录类似图书目录,更加方便学习!

Django2:Web项目开发入门笔记(6)

Django教程 小楼一夜听春语 7455浏览 0评论

这一篇教程,我们继续了解Django中模板的使用。

主要内容如下:

  • 内置标签和过滤器;
  • 模板中使用循环;
  • 模板中添加条件判断。

一、内置标签和过滤器

Django中有很多的内置标签,例如之前已经使用的block和extends。

关于内置标签,大家可以通过官方文档进行了解。【点此查看

在官方文档的页面中,除了内置模板标签,还有过滤器。

过滤器实际上就是一些函数,帮助我们进行数据的处理。

我们可以通过管道符“|”使用过滤器,格式为“{{ 变量|过滤器1|过滤器2 }}”。

我们来做个练习,试用几个过滤器。

首先,我们在视图中先添加一个视图函数。

在视图函数中,我们添加两项数据和页面内容进行整合。

示例代码:

def fiter_test(request):
    return render(request, 'filter.html', {'letters': 'abc', 'number': 1})

然后,我们添加URL分发配置。

示例代码:

path('filter/', siteviews.fiter_test),

最后,我们创建一个模板文件’filter.html’,在模板文件中我们使用过滤器对数据进行处理。

示例代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>过滤器</title>
</head>
<body>
{{ letters|length }}<br>
{{ letters|upper }}<br>
{{ letters|join:',' }}<br>
{{ number|add:1 }}<br>
{{ number|add:-1 }}<br>
</body>
</html>

在模板代码中,我们通过过滤器对字符串‘letters’分别进行了长度获取、转为大写以及逗号分隔的操作;对数字“number”分别进行了加1和减1的操作。

页面显示结果:

二、模板中使用循环

在一个模板页面中添加单个数据可以通过“{{ 变量名 }}”的方式来实现。

如果需要添加多个数据,则可以通过字典来实现。

例如,视图中向模板页面传入的数据为字典(例如:{‘person’:{‘name’:’小楼’,’sex’:’男’}}),在模板中则可以通过“{{ person.name }}”和“{{ person.sex}}”获取到相应的数据。

但是,如果页面中我们需要呈现一个列表(例如新闻列表),这时会有大量的数据需要处理,该如何实现呢?

另外,如果列表中有个别的项需要处理(例如第一项为红色字体),如何处理呢?

这些需求的实现,需要在模板中使用循环和条件判断。

如果有新闻列表内容的话,我们需要能够在页面中呈现出来。

这就需要在视图函数中获取一个新闻列表的数据内容,并在模板中循环加载出每一个列表项。

因为,我们还没有接触过模型(Model),暂时还不能和数据库进行关联,在这里我们先手动写出一个新闻列表的内容数据。

1、定义视图函数

在之前编写好的视图函数中,我们写出一个新闻列表内容,然后整合到模板定义的页面内容中。

此处只以经济新闻为例。

示例代码:

def news_list(request, news_type):
    news_dict = {'economic': '经济', 'sport': '体育'}
    news_titles = []
    if news_type == 'economic':
        news_titles = [('12/5', '作者成为全国首富。'), ('12/4', '作者成为全省首富。'),
                       ('12/3', '作者成为全市首富。'), ('12/2', '作者成为镇里首富。'), ('12/1', '作者成为村里首富。')]
    return render(request, 'news_list.html', {'news_type': news_dict[news_type], 'news_titles': news_titles})

2、模板中添加循环

示例代码:

{% extends 'base.html' %}
{% block title %}{{ news_type }}新闻{% endblock %}
{% block content %}
    {{ news_type }}新闻列表:
    <ul>
        {% for date,title in news_titles %}
            <li>{{ title }}({{ date }})</li>
        {% endfor %}
    </ul>
{% endblock %}

注意,模板中的循环是由“{% for 变量 in 可迭代对象 %}”和循环的内容以及“{% endfor %}”组成。

当我们完成上方代码之后,访问经济新闻列表页面,就能看到想要的效果了。

三、模板中添加条件判断

通过添加循环的代码,我们也能够看出,在模板中添加逻辑代码其实非常简单,只要了解添加的规则和能够使用的功能就可以了。

接下来,我们就尝试将新闻列表第一项的用红色字体显示。

示例代码:

{% extends 'base.html' %}
{% block title %}{{ news_type }}新闻{% endblock %}
{% block content %}
    {{ news_type }}新闻列表:
    <ul>
        {% for date,title in news_titles %}
            {% if forloop.first %}
                <li><font color="red">{{ title }}</font> ({{ date }})</li>
            {% endif %}
            <li>{{ title }}({{ date }})</li>
        {% endfor %}
    </ul>
{% endblock %}

上方代码中,红色部分是新增的代码。

通过条件判断,如果是循环第一项“forloop.first”,将“{{ title }}”的内容用“font”标签变为红色字体。

“forloop.first”是循环的一个变量,像这样的变量还有其他几个。

在PyCharm中,我们输入“forloop.”之后,就能够看到这些变量。

当我们写完“if”的语句块之后,不要忘了在最后添加“{% endif %}”。

不管是“for”还是“if”,在模板中他们都是标签,需要有开始标签和结束标签。

以上是我们对列表内容的一些处理。

不过,有时列表中没有内容的话,我们也需要进行处理。

在之前的示例中,不管是体育新闻还是经济新闻,我们都用的同一模板。

体育新闻,我们并没有任何列表数据,这时需要给用户一个提示。

那么,如何判断数据内容是空的,并给出相应提示呢?

示例代码:

{% extends 'base.html' %}
{% block title %}{{ news_type }}新闻{% endblock %}
{% block content %}
    {{ news_type }}新闻列表:
    <ul>
        {% for date,title in news_titles %} 
            {% if forloop.first %}
                 <li><font color="red">{{ title }}</font> ({{ date }})</li>
            {% endif %}
            <li>{{ title }}({{ date }})</li>
        {% empty %}
            抱歉:暂时没有新闻内容!
        {% endfor %}
    </ul>
{% endblock %}

上方代码中,红色代码是新增部分。

通过在for循环中添加“{% empty %}”,就能够对数据内容为空进行判断,从而给出相应提示。

当我们完成本篇教程的所有代码,再次启动开发服务器,访问经济新闻列表和体育新闻列表,就能够看到我们想要的结果了。

经济新闻页面:

体育新闻页面:

本节练习源代码:【点此下载

转载请注明:魔力Python » Django2:Web项目开发入门笔记(6)

头像
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网站 (可选)

网友最新评论 (2)

  1. 头像
    博主,求教:为啥我访问sport就报错Server Error (500),economic可以成功访问的
    我也想上进了呀6年前 (2018-08-11)回复
    • 小楼一夜听春语
      检查urls和views
      小楼一夜听春语6年前 (2018-08-13)回复