Django视图仅表示为一个Python函数,接收web请求并返回一个web响应。另外,返回响应结果的全部逻辑均位于视图中。
方法:
- 创建应用程序视图
- 针对每个视图定义URL。
- 创建HTML模版,以渲染视图所生成的数据。
其中,每个视图将渲染一个模版(向其中传递变量),并返回包含渲染输出结果的HTTP响应。
一、生成列表和视图
创建视图以显示帖子列表:
from django.shortcuts import render, get_object_or_404
from .models import Post
# Create your views here.
def post_list(request):
posts = Post.published.all()
return render(request,
'blog/post/list.html',
{'posts': posts})
- post_list视图接收request作为唯一参数,request参数是视图必须的参数。
- 再使用之前的published管理器,检索出所有包含published状态的帖子。
- 最后通过render()方法渲染包含给定模版的帖子列表。
另外,该函数返回的是一个包含渲染文件(一般为HTML代码)的HttpResponse对象
。
创建视图以显示帖子详情:
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.html',
{'post': post})
- post_detail视图接收yes,month,day,post作为参数。
- 使用get_object_or_404()快捷方法检索包含既定slug和日期的发布帖子。
- 在创建Post模型时,slug加入了unique_for_date属性,使得slug唯一,可用于检索唯一的帖子。
- 最后返回render()渲染后的响应
二、向视图添加URL路径
1.每个应用程序定义urls.py
URL路径可将URL映射到视图上。具体来说,URL路径由
Django遍历每个URL路径,并在第一个与请求URL匹配的路径处停止。随后,Django导入与URL路径匹配的视图并对其加以执行、传递HttpRequest类实例和关键字(或者位置参数)。
下面在blog应用程序目录中创建urls.py,并添加以下代码:
from django.urls import path
from . import views
app_name = 'blog'
urlpatterns = [
# post views
path('', views.post_list, name='post_list'),
path('<int:year>/<int:month>/<int:day>/<slug:post>/',
views.post_detail, name='post_detail'),
]
在上面代码中:
- app_name定义了应用程序命名空间,可通过应用程序组织URL,并在引用时使用对应名称。
- path定义了两个不同的路径
- 使用路径转换器<int:year>(尖括号)来实现特定匹配
注:如果path和转换器无法满足当前要求,可以使用re_path()定义包含正则表达式的复杂URL路径。
参考文档:https://docs.djangoproject.com/en/3.0/ref/urls/#django.urls.re_path
2.项目主URL路径
在项目urls.py下添加下列代码:
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/',include('blog.urls',namespace='blog')),
]
利用Include()方法定义的新的URL路径引用了定义于blog应用程序中的URL路径,因而包含于blog/路径中。
另外,此类路径还位于命令空间blog中,命令空间在整个项目中是唯一的。这样,我们即可方便的引用blog URL,如blog:post_list和blog:post_detail。
参考文档:ttps://docs.djangoproject.com/en/3.0/topics/http/urls/#url-namespaces
三、模型的标准URL
向返回对象的标准URL的模型中添加get_absolute_url()方法
,针对此方法,我们使用reverse()方法,通过对应的名称和所传递的可选参数构建URL。
编辑models.py文件并添加下列代码:
from django.urls import reverse
class Post(models.Model):
# ...
def get_absolute_url(self):
return reverse('blog:post_detail',
args=[self.publish.year,
self.publish.month,
self.publish.day, self.slug])
我们可使用模版中的get_absolute_url()方法,进而链接至特定的帖子。