Django 中的视图的概念是「一类具有相同功能和模板的网页的集合」。
比如,在一个博客应用中,你可能会创建如下几个视图:
- 博客首页:展示最近的几项内容。
- 内容“详情”页:详细展示某项内容。
- 评论处理器:用于响应为一项内容添加评论的操作。
这些需求都靠 视图(View) 来完成。
视图初探
首先写一个最简单的视图函数,在浏览器中打印出Hello World!字符串。
打开article/views.py,写出视图函数:
# 导入 HttpResponse 模块
from django.http import HttpResponse
# 视图函数
def article_list(request):
return HttpResponse("Hello World!")
- 在 Django 中,网页都是从视图派生而来。每一个视图表现为一个简单的 Python 函数,它必须要做的只有两件事:返回一个包含被请求页面内容的
HttpResponse对象,或者抛出一个异常,比如Http404。至于你还想干些什么,随便你。- 视图函数中的 request 与网页发来的请求有关,里面包含
get或post的内容、用户浏览器、系统等信息。Django调用article_list函数时会返回一个含字符串的 HttpResponse 对象。
配置URLconfs
有了视图函数,还需要配置 URLconfs ,将用户请求的 URL链接 关联起来。换句话说, URLconfs 的作用是将 URL 映射到视图中。
在前面的文章中已经将项目 /article 的 URL 分发给了 article 应用,因此这里只需要修改之前添加的 article/urls.py 就可以。添加以下代码:
article/urls.py
# 引入views.py
from . import views
...
urlpatterns = [
# path函数将url映射到视图
path('article-list/', views.article_list, name='article_list'),
]
测试一下刚才敲的代码是否工作正常。
Django 管理页面
创建管理员账号(Superuser)
输入python manage.py createsuperuser指令
将ArticlePost注册到后台中
接下来我们需要“告诉”Django,后台中需要添加 ArticlePost 这个数据表供管理。
打开article/admin.py,写入以下代码:
article/admin.py
from django.contrib import admin
# 别忘了导入ArticlerPost
from .models import ArticlePost
# 注册ArticlePost到admin中
admin.site.register(ArticlePost)
启动server,在浏览器中输入http://127.0.0.1:8000/admin/,一切正常的话就可以看到下登录界面了。
改写视图函数
为了让视图真正发挥作用,改写article/views.py中的article_list视图函数:
article/views.py
from django.shortcuts import render
# 导入数据模型ArticlePost
from .models import ArticlePost
def article_list(request):
# 取出所有博客文章
articles = ArticlePost.objects.all()
# 需要传递给模板(templates)的对象
context = { 'articles': articles }
# render函数:载入模板,并返回context对象
return render(request, 'article/list.html', context)
.models表示从当前文件夹的models.py文件中导入ArticlePost数据类ArticlePost.objects.all()从ArticlePost数据类获得所有的对象(即博客文章),并传递给articles变量context定义了需要传递给模板的对象,即articles- 最后返回了
render函数:
- 第一个变量是固定的
request对象,照着写就可以- 第二个变量定义了模板文件的位置、名称,即
article/list.html- 第三个变量定义了需要传入模板文件的对象,即
context
编写模板(template)
模板存放路径
在前面的视图中我们定义了模板的位置在article/list.html,因此在应用目录下新建 templates 文件夹,再新建 article 文件夹,再新建list.html文件,即myblog\article\templates\article\list.html。
Django 将会应用/templates在这个目录里查找模板文件。
换句话说,你的模板文件的路径应该是 <appname>/templates/<appname>/xxx.html 。因为app_directories 模板加载器是通过上述描述的方法运行的,所以 Django 可以引用到 <appname>/xxx.html 这一模板了。
你项目
settings的TEMPLATES配置项描述了 Django 如何载入和渲染模板。默认的设置文件设置了DjangoTemplates后端,并将APP_DIRS设置成了True。这一选项将会让DjangoTemplates在每个INSTALLED_APPS文件夹中寻找 "templates" 子目录。
模板命名空间
虽然我们现在可以将模板文件直接放在
<appname>/templates文件夹中(而不是再建立一个<appname>子文件夹),但是这样做不太好。Django 将会选择第一个匹配的模板文件,如果你有一个模板文件正好和另一个应用中的某个模板文件重名,Django 没有办法 区分 它们。我们需要帮助 Django 选择正确的模板,最好的方法就是把他们放入各自的 命名空间 中,也就是把这些模板放入一个和 自身 应用重名的子文件夹里。
编写模板
在list.html文件中写入:
templates/article/list.html
{% for article in articles %}
<p>{{ article.title }}</p>
{% endfor %}
在浏览器中输入地址http://127.0.0.1:8000/article/article-list,成功!