使用Django搭建一个博客系统6——在前端显示文章标题

这一步需要更改三个方面的内容
1、blog文件夹中的views.py文件(视图)
视图的作用相当于URL和模板的连接器,我们在浏览器中输入URL,Django通过视图找到相应的模板,然后返回给浏览器。
2、blog文件夹中创建一个templates文件夹,用作模板目录(很多人喜欢把它放在一级目录,mysite中)
3、mysite和blog文件夹中的urls.py文件

书写步骤:views.py——url——templates
执行流程:
先使用views.py获取数据库中的数据;再把数据用templates模板进行修饰,生成网页;最后urls.py根据网页生成链接。

但是最后还需要修改models.py文件。不太清楚改啥???

一、创建视图

blog文件夹中的***views.py***文件中增加几个方法,就是创建几个视图。这些视图最后就是成为一个个的网页,比如目录导航、文章内容等。
一个视图就是一个python方法,用于控制页面显示结果,接收一个web请求(resquest),返回一个web相应(response)
views.py中本身只有一句:

from django.shortcuts import render

其他的都需要我们自己编写,直接上完整程序吧。

1、先做一个文章的标题列表,做二级目录

from django.shortcuts import render,get_object_or_404#get_object_or_404是引入了一个404模块
from .models import Post#从models.py中导入刚创建的Post类;models前边有个点,表示本目录下

def post_list(request):#视图函数的第一个参数必须是request
	posts=Post.published.all()#published为已发布文章,posts获取所有已发布文章的的所有内容
	return render(request,'blog/post/list.html',{'posts':posts})
	#render函数用于模板渲染;{'posts':posts}是一个字典,值posts就是刚才获取到的已发布文章的所有内容了

post_list视图函数,将request对象作为唯一参数;posts获取了所有状态为published的帖子;使用django自带的快捷方法render将posts以list.html模板的格式显示出来。

具体显示哪些内容,可以在模板上做筛选。

render函数的使用方法:
参数讲解:
request: 是一个固定参数, 没什么好讲的。
template_name: templates 中定义的文件, 要注意路径名. 比’templates\polls\index.html’, 参数就要写‘polls\index.html’ (模板名:‘blog/post/list.html’)
context: 要传入文件中用于渲染呈现的数据, 默认是字典格式**({‘posts’:posts})**
content_type: 生成的文档要使用的MIME 类型。默认为DEFAULT_CONTENT_TYPE 设置的值。
status: http的响应代码,默认是200.
using: 用于加载模板使用的模板引擎的名称。

此方法的作用—结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
通俗的讲就是把context的内容, 加载进templates中定义的文件, 并通过浏览器渲染呈现.

render函数的返回的值是一个 Unicode 对象,不是普通的 Python 字符串。 你可以通过字符串前的 u 来区分。 在框架中,Django 会一直使用 Unicode 对象而不是普通的字符串。

2、再在views.py中增加一个方法,用于显示文章详情页

下边的代码有疑问???

def post_detail(request,year,month,day,post):
	post=get_object_or_404(Post,slug=post,status='published',publish__year=year,publish__month=month,publish__day=day)
	return render(request,'blog/post/detail.heml',{'post':post})

问题1:def post_detail(request,year,month,day,post):这里的post是做什么用途的?
问题2:post=get_object_or_404(Post,slug=post,status=‘published’,publish__year=year,publish__month=month,publish__day=day)
等号后边的内容是啥意思?为什么要这样写?
return render(request,‘blog/post/detail.heml’,{‘post’:post})这个返回值应该是404的值吗?
这个是查询吗??

二、为视图指定URL

一个URL模式由三部分组成:
一个python的正则表达式,一个视图view,一个全项目范围内的命名

Django会遍历所有的URL模式,直到第一个匹配的请求URL为止

具体流程如下:

1、在blog文件夹中创建一个urls.py,并修改

(1)先将二级mysite文件夹中 urls.py的内容拷贝到新文件中,然后再做修改
(2)改好后的为(blog文件夹中的urls.py):

from django.conf.urls import url#这个是原来的,不变
from . import views#这个是改的,from后的点,表示本文件夹路径下的views.py文件
urlpatterns=[#这个是改的,注意使用中括号
	url(r'^$',views.post_list,name='post_list'),
]

url(r’^KaTeX parse error: Expected group after '^' at position 41: …ost_list') r表示'^̲'这个不使用转义
^是正则表达式,表示字符串的开始
$表示字符串的结束

2、改一下二级mysite目录下的urls.py,添加一句

from django.conf.urls import url,include#用include,还需要再导入一下,增加一个include,其他不变
………………………………………………
urlpatterns=[………………
	url(r'^blog/',include('blog.urls',namespace='blog',app_name='blog')),#其他不变,就增加这一句
]

3、增加模板

定义urls.py后,原网址就打不开了,需要在二级目录blog下新增一歌***templates***文件夹用于存放模板。
templates文件夹下创建了blog文件夹,blog文件夹下又有post文件夹
里边放两个模板文件
list.html***和***detail.html
然后才能打开网页

三、还得再改一下blog文件夹下的models.py文件

from django.core.urlresolvers import reverse#先导入一个模块
def get_absolute_url(self):#这个方法是默认的,添加到最后即可
	return reverse("blog:post_detail",orgs=[self.publish.year,self.publish.strftime('%m'),self.publish.strftime('%d'),self.slug])

reverse是一个标准函数,构建一个url
这段不理解

你可能感兴趣的:(使用Django搭建一个博客系统6——在前端显示文章标题)