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

时间:2016-02-15 10:29:23

标签: 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

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

帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

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

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

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

您可以从运行要从中调用自定义方法的步骤的方法调用自定义方法。如果您想在视图发现表单有效后运行您的方法,则执行以下操作:

<strong>Step 0.1</strong><br/>
<input type="number" min="0.1" step="0.1"/><br/>
<strong>Step 1.0</strong><br/>
<input type="number" min="0.1" step="1.0"/><br/>
<strong>Step 1 (not working)</strong><br/>
<input type="number" min="0.1" step="1"/><br/>
<strong>Step 'any' (not working)</strong><br/>
<input type="number" min="0.1" step="any"/><br/>

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

您如何知道执行视图的每个步骤使用的泛型方法?视图在获取表单的初始数据时调用的方法是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) ?来自django docs和https://ccbv.co.uk/。 它看起来很复杂,但实际上你只需编写很少的方法,就像你需要添加自己的行为一样。