2011-08-22 20 views
11

Sto scrivendo la mia prima app in Django e ho un problema con la vista generica create_object; Nel mio urls.py, ho:Estensione viste generiche di Django

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

Il problema è che quando l'utente invia il modulo di "nuovo", ho bisogno di manipolare i dati che verranno salvati nel database (in realtà ho bisogno di aggiungere il user_id estera chiave); senza Visualizzazioni generici ho usato per scrivere:

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

a mio avviso (avviso data.user=request.user). Ho cercato documenti Django ma non riesco a trovare un modo per farlo (magari estendendo la classe CreateView) - un po 'in The Book c'è solo un esempio che sovrascrive il metodo get_object di una classe ListView per aggiornare un campo last_accessed_date.

+0

Ecco il "effettuano un lavoro extra" in cui spiega che il metodo get_object potrebbe essere sovrascritto estendendo la classe [link] (https://docs.djangoproject.com/en/dev/topics/class-based-views/#performing-extra-work) –

risposta

20

È possibile farlo eseguendo l'override del metodo 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: Oggi vorrei ignorare form_valid secondo 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) 
Problemi correlati