Django通用视图

有些视图反映基本的网络开发中的一个常见情况:根据 URL 中的参数从数据库中获取数据、载入模板文件然后返回渲染后的模板。 由于这种情况特别常见,通用视图将通用模式抽象到你甚至不需要编写Python代码来编写应用程序的程度。例如,ListView和DetailView泛型视图分别抽象了"显示对象列表"和"显示特定类型对象的详细页面"的概念。

📌当编写一个 Django 应用时,应该先评估一下通用视图是否可以解决你的问题,你应该在一开始使用它,而不是进行到一半时重构代码。

以投票应用为例,关于投票应用的更多内容,请查看

Django创建投票应用-CSDN博客

首先重构polls/urls.py

python 复制代码
from django.urls import path
from . import views

app_name = "polls"
urlpatterns = [
    path("", views.IndexView.as_view(), name="index"),
    path("<int:pk>/", views.DetailView.as_view(), name="detail"),
    path("<int:pk>/results/", views.ResultsView.as_view(), name="results"),
    path("<int:question_id>/vote/", views.vote, name="vote"),
]

📌第二个和第三个模式的路径字符串中匹配模式的名称已从question_id更改为pk。这是必要的,因为我们将使用DetailView通用视图来取代detail()和results()视图,并且它期望从URL捕获的主键值称为"pk"。

我们将删除旧的 index, detail, 和 results 视图,并用 Django 的通用视图代替。

重构 polls/views.py 文件

python 复制代码
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.urls import reverse
from django.views import generic

from .models import Choice, Question

class IndexView(generic.ListView):
    template_name = "polls/index.html"
    context_object_name = "latest_question_list"

    def get_queryset(self):
        """Return the last five published questions."""
        return Question.objects.order_by("-pub_date")[:5]

class DetailView(generic.DetailView):
    model = Question
    template_name = "polls/detail.html"

class ResultsView(generic.DetailView):
    model = Question
    template_name = "polls/results.html"

def vote(request, question_id):
    ...  # same as above, no changes needed.

📌每个通用视图都需要知道它将作用于哪个模型。这可以使用model属性或通过定义get_queryset()方法(如IndexView中所示)来提供。
📌默认情况下,通用视图 DetailView 使用一个叫做 <app name>/<model name>_detail.html 的模板。在投票的例子中,它将使用 "polls/question_detail.html" 模板。template_name 属性是用来告诉 Django 使用一个指定的模板名字,而不是自动生成的默认名字。
📌ListView 使用一个叫做 <app name>/<model name>_list.html 的默认模板;使用 template_name 来告诉 ListView 使用我创建的已经存在的 "polls/index.html" 模板。
📌对于 DetailView , question 变量会自动提供------ 因为我们使用 Django 的模型(Question), Django 能够为 context 变量决定一个合适的名字。然而对于 ListView, 自动生成的 context 变量是 question_list。为了覆盖这个行为,使用 context_object_name 属性,表示我们想使用 latest_question_list。

启动服务器,使用一下基于通用视图的新投票应用。

相关推荐
(・Д・)ノ2 分钟前
python打卡day22
python
achene_ql34 分钟前
深入探索 RKNN 模型转换之旅
python·目标检测·rk3588·模型部署·rk3566
@十八子德月生1 小时前
8天Python从入门到精通【itheima】-1~5
大数据·开发语言·python·学习
每天一个秃顶小技巧2 小时前
02.Golang 切片(slice)源码分析(一、定义与基础操作实现)
开发语言·后端·python·golang
安特尼3 小时前
招行数字金融挑战赛数据赛道赛题一
人工智能·python·机器学习·金融·数据分析
serve the people4 小时前
解决osx-arm64平台上conda默认源没有提供 python=3.7 的官方编译版本的问题
开发语言·python·conda
多多*5 小时前
Java反射 八股版
java·开发语言·hive·python·sql·log4j·mybatis
正在走向自律5 小时前
从0到1:Python机器学习实战全攻略(8/10)
开发语言·python·机器学习
西西弗Sisyphus5 小时前
Python 处理图像并生成 JSONL 元数据文件 - 灵活text版本
开发语言·python
Taichi呀5 小时前
PyCharm 快捷键指南
ide·python·pycharm