2016-02-15 2 views
2

Я хочу использовать общие взгляды базового класса с помощью Джанго 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. Как я могу добиться этого? Я знаю, что использование функции base view просто, но я хочу сделать это, используя базовые представления класса.

Справка будет оценена по достоинству.

+0

Непонятно, что вы пытаетесь достичь здесь, вы можете отвечать только на URL-адреса с помощью [http-запроса] (https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html) – Sayse

ответ

3

Да, это главный вопрос, который нужно понять в 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/. Это выглядит сложным, но на самом деле вам нужно написать очень мало методов, только там, где вам нужно добавить свое собственное поведение.

+0

В url невозможно ли напрямую вызвать метод generate_invoice()? – Gaurav

+0

Почему? когда вы хотите его запустить? –

+0

В url CBV возвращает as_view(), которая является вызываемой функцией, которая получает reuqest, https://docs.djangoproject.com/es/1.9/ref/class-based-views/base/#django.views.generic .base.View.as_view. Из этой точки входа (на самом деле метод отправки CBV) CBV выполняет все этапы. –

 Смежные вопросы

  • Нет связанных вопросов^_^