构建列表和详细视图

Django视图仅表示为一个Python函数,接收web请求并返回一个web响应。另外,返回响应结果的全部逻辑均位于视图中。

方法

  1. 创建应用程序视图
  2. 针对每个视图定义URL。
  3. 创建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})
  1. post_list视图接收request作为唯一参数,request参数是视图必须的参数。
  2. 再使用之前的published管理器,检索出所有包含published状态的帖子。
  3. 最后通过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})
  1. post_detail视图接收yes,month,day,post作为参数。
  2. 使用get_object_or_404()快捷方法检索包含既定slug和日期的发布帖子。
    • 在创建Post模型时,slug加入了unique_for_date属性,使得slug唯一,可用于检索唯一的帖子。
  3. 最后返回render()渲染后的响应

二、向视图添加URL路径

1.每个应用程序定义urls.py

URL路径可将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()方法,进而链接至特定的帖子。

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享