zoukankan      html  css  js  c++  java
  • Django-简述generic views

    Use generic views: Less code is better.

    这些视图代表了基本Web开发的常见情况:根据URL中传递的参数从数据库中获取数据,加载模板并且返回呈现的模板。因为这很常见,Django提供了一个快捷方式,称为“Generic Views”系统。

    通用视图抽象了常见的模式,甚至不需要编写Python代码就可以编写应用程序。

    让我们将投票应用程序转换为使用通用视图系统,这样我们就可以删除自己的一些代码。我们只需要采取几个步骤来进行转换。我们将

    1. 转换URLconf (Convert the URLconf)
    2. 删除(修改)一些旧的、不需要的视图。(Delete some of the old, unneeded views.)
    3. 基于Django的泛型视图引入新的视图。(Introduce new views based on Django's generic views.)

    转换URLconf

    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>。

    删除旧的views(并且引入 generic views)

    # polls/views.py
    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]
    

    # def detail(request, question_id):
    #     question = get_object_or_404(Question, pk=question_id)
    #     return render(request, 'polls/detail.html', {'question': question})

    class DetailView(generic.DetailView): model = Question template_name = 'polls/detail.html' class ResultsView(generic.DetailView): model = Question template_name = 'polls/results.html'
    • 每个通用视图都需要知道它将作用于什么模型(models)。这是使用model属性提供的。例如,model = Question
    • DetailView 通用视图期望从URL捕获的主键值被称为“pk”,因此我们将通用视图的question_id更改为pk。例如,detail()函数中之前的参数是question_id。

    默认情况下,DetailView 通用视图使用被称为 <app_name>/<model_name>_detail.html 的模板。例如,template_name = 'polls/detail.html'。template_name属性通常会告诉Django要使用一个确切的模板名字,而不是自动装配默认的模板名字。

    类似地,ListView通用视图使用名为<app name> / <model name> _list.html的默认模板; 我们使用template_name属性告诉ListView使用我们现有的“polls / index.html”模板。

    在手册的前几页中,模板提供了一个上下文,其中包含 question 和 latest_question_list 类似的上下文变量。对 DetailView来说,如果我们使用一个Django模型-Question,那么question变量是自动提供的,不用自己声明。并且,对ListView来说,也会自动装配上下文变量-question_list。为了覆盖这个属性,我们提供了 context_object_name 属性,指定我们想要使用 latest_question_list。作为一种可代替的方法,你可以改变你的模板来匹配新的默认上下文变量。但是,让Django使用您想要的变量要容易得多。(就是说,不用自定义,默认就好)

  • 相关阅读:
    ASP.Net 显示
    ASP.Net EF框架
    ASP.Net redis存取方法
    ASP.Net 红包
    winform 代码生成textbox ,checkbox
    c# winform 窗体 对话框绑定的值如何填到主窗体问题
    c# / .net wFramework winform 之运行后的窗体窗口可拖动操作
    托管调试助手 "DisconnectedContext":“针对此 RuntimeCallableWrapper 向 COM 上下文 0xd47808 的转换失败,错误如下: 系统调用失败。
    使用C#语言,如何实现EPLAN二次开发 Api插件及菜单展示
    winform 学习之qq邮箱正则验证及常用正则
  • 原文地址:https://www.cnblogs.com/daemonFlY/p/11504149.html
Copyright © 2011-2022 走看看