在 Django 类基本视图中创建自定义方法

Wag*_*agh 6 python django django-class-based-views

我想使用 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
Run Code Online (Sandbox Code Playgroud)

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

帮助将不胜感激。

Avi*_*aor 7

是的,这是 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)
Run Code Online (Sandbox Code Playgroud)

所以你必须决定你的自定义方法应该在哪里运行,并在这个步骤的视图通用方法之上定义你自己的方法。

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