编写视图代码,从模板中取出数据,并把数据传给模板。
article/views.py
from django.shortcuts import render
from .models import ArticlePost
def article_list(request):
# 从ArticlePost取出所有文章
articles = ArticlePost.objects.all()
# 前面的'articles'只是一个命名,在模板中通过这个命名获取传过去的数据,你也可以改成别的
# 后面的articles是上一行代码中获得的所有文章
context = { 'articles': articles }
# 第一个参数是固定的request。第二个参数是指定要把数据传输到哪个模板,
# 即article文件夹下面的list.html。第三个参数是要传输的数据。
return render(request, 'article/list.html', context)
下面编写模板文件。在根目录my_blog文件夹下新建文件夹templates,这个文件夹用来存放所有的模板文件。templates文件夹中新建文件夹article,这个文件夹用来存放article应用的模板文件。article文件夹中新建list.html文件。在list.html中输入下面的代码。
templates/article/list.html
{% for article in articles %}
{ { article.title }}
{% endfor %}
模板中的逻辑代码要用{% %}括起来,属性值用{ { }}括起来。第一行代码表示这是一个for循环,从articles中把所有数据挨个取出来,并命名为article,articles是刚才在views.py中定义的名称。第二行代码把article中的title属性展示出来,其中article是上一行代码中命名的。第三行代码表示循环结束。
虽然我们已经把模板文件写好了,但是Django还不知道模板文件的位置,需要我们在settings.py中注册。找到TEMPLATES中的DIRS这一行,改成下面的样子。
my_blog/settings.py
TEMPLATES = [
{
...
'DIRS': [os.path.join(BASE_DIR, 'templates')],
...
},
]
其中BASE_DIR表示项目的根目录,'templates'表示模板文件在根目录中的templates文件夹中。
我们再来看views.py中的return render(request, 'article/list.html', context)这句代码。list.html的实际位置是my_blog/templates/article/list.html,因为配置文件已经把模板文件的位置指定到了templates这里,我们只需要接着写更详细的位置就可以了,即article/list.html,Django会把这些路径拼接起来。
模型,视图,模板,都已经写好了,但是我们还没有指定访问路径。之前我们在my_blog中的urls.py中指定了article应用的路径,下面我们在打开在上一篇文章中新建的article的路由文件urls.py,并在urlpatterns中添加下面的代码。
article/urls.py
from . import views
...
urlpatterns = [
path('article_list/', views.article_list, name='article_list'),
]
'article_list/'指定该文件在article应用内的访问路径,和my_blog/urls.py中的路径拼接起来,路径是这样的:my_blog/article/article_list/。views.article_list指定了访问视图中的article_list函数。name是为这个路径定义一个名称,方便后面我们使用。
我们来梳理一下my_blog中的urls.py和article中的urls.py的关系。my_blog相当于是一个学校,它的urls.py是学校的班级清单,'article/'指向某个班级,比如三年级一班,include表示如果你想找到这个班级里的某一个学生,那么你应该去看这个班级的学生清单,即'article.urls',namespace相当于这个班级的外号,比如尖子班。
article的urls.py相当于这个班级的学生的清单,article_list/指向某一个学生,name相当于这个学生的外号。my_blog/article/article_list/就相当于皮皮小学/三年级一班/皮皮虾同学。
此时数据库中还没有文章,我们要在Django后台中创建几篇。
创建管理员账号。
(env) C:\Users\glp\blog\env\my_blog>python manage.py createsuperuser
Username: username
Email address: [email protected]
Password:
Password (again):
Superuser created successfully.
把模型里的ArticlePost注册到后台,后台才会显示ArticlePost。打开article文件夹中的admin.py文件并输入下面的代码。
article/admin.py
from django.contrib import admin
from .models import ArticlePost
admin.site.register(ArticlePost)
然后我们在cmd中启动开发服务器。
(env) C:\Users\glp\blog\env\my_blog>python manage.py runserver
打开浏览器并输入http://127.0.0.1:8000/admin,进入后台管理员登录界面,输入刚才创建的管理员账号,登录后点击Article posts进入文章列表,点击右上角的“ADD ARTICLE POST +”按钮,选择作者(目前只有一个管理员用户,所以只能选择管理员),输入title和body,创建时间不用输入,会自动生成,最后点右下角的“SAVE”按钮。这时我们就能从后台看到一篇文章了,显示的是文章的title,这是我们在models.py中的__str__方法里定义的,返回的是文章的title属性。
为了看到文章列表的效果,你可以再创建几篇文章。
另外打开一个浏览器,输入http://127.0.0.1:8000/article/article_list就可以看到我们创建的几篇文章了。http://127.0.0.1:8000/是服务器的访问地址,article/article_list是我们在两个urls.py中定义的。
虽然文章全部显示出来了,但是界面好丑,我们将在下一篇教程中引入bootstrap美化模板:Python3.8+Django3.0搭建个人博客(4)引入bootstrap