[学习:Django搭建个人博客 3]View视图

132 阅读4分钟

参考:Django搭建个人博客:View视图初探

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 与网页发来的请求有关,里面包含 getpost 的内容、用户浏览器、系统等信息。Django调用 article_list 函数时会返回一个含字符串的 HttpResponse 对象。

配置URLconfs

有了视图函数,还需要配置 URLconfs ,将用户请求的 URL链接 关联起来。换句话说, URLconfs 的作用是将 URL 映射到视图中。

在前面的文章中已经将项目 /articleURL 分发给了 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 这一模板了。

你项目 settingsTEMPLATES 配置项描述了 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,成功!

image.png