2011-08-22 20 views
11

Piszę moją pierwszą aplikację w Django i mam problem z create_object Widok ogólny; W moim urls.py, mam:Rozszerzanie ogólnych widoków Django

(r'^new$', CreateView.as_view()), 

Problemem jest to, że gdy użytkownik podnosi „nowe” formy, muszę manipulować dane, które zostaną zapisane do bazy danych (I rzeczywiście trzeba dodać user_id zagraniczny klawisz); bez widoki generyczne kiedyś napisać:

form = ClientForm(request.POST) 
    if form.is_valid(): 
     data = form.save(commit=False) 
     data.user = request.user 
     data.save() 
     form.save_m2m() 

moim zdaniem (wypowiedzenia data.user=request.user). Przeszukałem dokumenty Django, ale nie mogę znaleźć sposobu, aby to zrobić (być może rozszerzając klasę CreateView) - w książce znajduje się tylko przykład, który przesłania metodę get_object klasy ListView, aby zaktualizować pole last_accessed_date.

+0

Oto "Wykonywanie dodatkowej pracy", gdzie wyjaśnia, że ​​metoda get_object może zostać nadpisana przez rozszerzenie klasy [link] (https://docs.djangoproject.com/en/dev/topics/class-based-views/#performing-extra-work) –

Odpowiedz

20

Można to zrobić poprzez nadpisanie metody get_form:

from django.views.generic import CreateView 

class CustomCreateView(CreateView): 
    def get_form(self, form_class): 
     form = super(CustomCreateView, self).get_form(form_class) 
     form.instance.user = self.request.user 
     return form 

EDIT: Dzisiaj chciałbym zastąpić form_valid zgodnie Issac Kelly's answer:

from django.views.generic import CreateView 

class CustomCreateView(CreateView): 
    def form_valid(self, form): 
     form.instance.user = self.request.user 
     return super(CustomCreateView, self).form_valid(form) 
Powiązane problemy