【问题标题】:create custom methods in django class base views在 django 类基础视图中创建自定义方法
【发布时间】:2021-03-29 06:57:15
【问题描述】:

我想在 django 1.9 中使用通用类基础视图 我想了解的内容

from django.views.generic import CreateView
from braces.views import LoginRequiredMixin
from .models import Invoice

class InvoiceCreateView(LoginRequiredMixin,CreateView):
    model = Invoice

    def generate_invoice(self):
        ...
        return invoice

现在我想将此自定义方法绑定到 url。我怎样才能做到这一点? 我知道使用函数基础视图很简单,但我想使用类基础视图来做到这一点。

我们将不胜感激。

【问题讨论】:

  • 不清楚你想在这里实现什么,你只能用http request回复网址

标签: python django django-class-based-views


【解决方案1】:

是的,这是 CBV 中要掌握的主要问题:当事情运行时,执行顺序是什么(参见 http://lukeplant.me.uk/blog/posts/djangos-cbvs-were-a-mistake/)。

简而言之,每个基于类的视图都有一个运行顺序,每个都有自己的方法。

CBV 的每个执行步骤都有专用的方法。

您可以从运行您要从中调用自定义方法的步骤的方法中调用自定义方法。如果你想在视图发现表单有效之后运行你的方法,你可以这样做:

Class InvoiceCreateView(LoginRequiredMixin,CreateView):
    model = Invoice

    def generate_invoice(self):
        ... do something with self.object
        return invoice

    def form_valid(self,form):

        self.object = form.save()
        self.generate_invoice()
        return super(InvoiceCreateView,self).form_valid(form)

因此,您必须决定您的自定义方法应该在哪里运行,并在此步骤的视图通用方法之上定义您自己的方法。

您如何知道执行视图的每个步骤使用什么通用方法?视图在获取表单的初始数据时调用的方法是def get_initial?来自 django 文档和 https://ccbv.co.uk/。 它看起来很复杂,但实际上您只需编写很少的方法,就在您需要添加自己的行为的地方。

【讨论】:

  • 在url中不能直接调用generate_invoice()方法吗?
  • 为什么?您希望它何时运行?
  • 在 url 中,CBV 返回 as_view(),这是一个可调用函数,可获取请求 docs.djangoproject.com/es/1.9/ref/class-based-views/base/…。从这个入口点(实际上是 CBV 调度方法),CBV 运行所有步骤。
  • 考虑我想做一些计算并将部分数据保存在其他表中。我在 generate_invoice() 方法中写了所有这些。
  • 那么你为什么要在 url 中运行它呢? url 只是调用正确的视图。从这个角度来看,你继续。
猜你喜欢
  • 2015-10-17
  • 2015-06-09
  • 2022-08-02
  • 2014-12-10
  • 2018-08-16
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
相关资源
最近更新 更多