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的静态资源路由需要指向这里。这个文件夹可以用绝对路径指定到项目外,因为这个路径和开发没有任何关系,部署时才会用到。