使用模板显示数据

Django中,模板对应的就是MTV模式的T,HTML在服务器端模板生成返回给用户。这篇笔记记录如何在Django中使用模板。

一个简单的例子

下面例子代码中,访问一个URL,返回一个list,模板中使用for语法,在一个table中展示。

app1
├── __init__.py
├── models.py
├── templates
│   └── user_list.html
├── urls.py
└── views.py

models.py

class User(models.Model):
    username = models.CharField(max_length=20)
    age = models.IntegerField()
    birthday = models.DateTimeField()

views.py

def query_list(request):

    user_list = []
    u1 = models.User(username="tom", age=10, birthday=timezone.now())
    u2 = models.User(username="jerry", age=10, birthday=timezone.now())
    u3 = models.User(username="lucy", age=10, birthday=timezone.now())

    user_list.append(u1)
    user_list.append(u2)
    user_list.append(u3)

    context = {
        "user_list": user_list
    }

    return render(request, "user_list.html", context)

注意render()函数的参数,context有点像springMVC中的ModelAndView,用于向模板传递用于显示的数据结构。render()其实是封装了HttpResponse(template.render(context, request))

user_list.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户列表</title>
</head>
<body>
<table border="1px">
    {% for user in user_list %}
        <tr>
            <td>{{ user.username }}</td>
            <td>{{ user.age }}</td>
            <td>{{ user.birthday }}</td>
        </tr>
    {% endfor %}
</table>
</body>
</html>

模板里使用了for循环遍历list,在一个table中进行显示。

分支和循环

模板中,分支和循环渲染逻辑非常常用,它们的写法如下。

{% if 判断条件 %}
    ...
{% else %}
    ...
{% endif %}
{% for 变量 in 可迭代对象 %}
    ...
{% endfor %}

关于其它模板指令,这里就不多介绍了,具体参考文档即可。

引用静态资源

模板中肯定会用到JavaScript、CSS等前端文件,这些内容是存于服务器上的静态文件,而非动态生成的数据。Django中有静态资源的默认存放路径,位于项目根目录/模块名/static/模块名/下。在模板中,引入方式如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试页面</title>
    {% load static %}
    <link href="{% static 'app1/bootstrap.min.css' %}" rel="stylesheet" type="text/css"/>
    ...
</head>
...
</html>

模板中使用static能够自动帮我们生成静态文件的引入路径,开发调试时,测试服务器也会正确的处理静态文件。但要注意,部署时,还是需要在Nginx中手动配置静态文件的URL路径和文件位置STATIC_ROOT的。

实际上,我的习惯是一个工程会把所有静态文件集中存放在一个文件夹中,比如工程根目录/static/。这需要在settings.py中进行额外的配置:

STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)

STATIC_ROOT = os.path.join(BASE_DIR, 'collect_static')

STATIC_URL配置了静态文件的URL路径,由测试服务器或部署后的Nginx响应该URL,返回静态文件。

STATICFILES_DIRS配置了包含静态资源的文件夹在工程中的位置,我们编写的CSS、JS等文件都放在其中。

STATIC_ROOT指定的是部署时,collectstatic的输出路径,它会将我们编写的静态资源和依赖包中的静态资源(比如admin面板)合并复制到指定文件夹中,部署时Nginx的静态资源路由需要指向这里。这个文件夹可以用绝对路径指定到项目外,因为这个路径和开发没有任何关系,部署时才会用到。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap