2013-07-24 9 views
5

Mi sto esercitando in Django Class-Based-View con un'applicazione di blog di base. Per qualche motivo, tuttavia, il modello CreateView for my Post non sta salvando il post all'interno del database.Django CreateView non sta salvando l'oggetto

models.py

class Post(models.Model): 
    user = models.ForeignKey(User) 
    post_title = models.CharField(max_length=200) 
    post_content = models.CharField(max_length=500) 
    post_date = models.DateTimeField('date posted') 

forms.py

class PostForm(forms.ModelForm): 
    class Meta: 
     model = Post 
     exclude = ('user', 'post_date') 

views.py

class PostCreate(CreateView): 
    template_name = 'app_blog/post_save_form.html' 
    model = Post 
    form_class = PostForm 

    def form_valid(self, form): 
     form.instance.user = self.request.user 
     form.instance.post_date = datetime.now() 
     return super(PostCreate, self).form_valid(form) 

visualizza wi contenuti generando qualsiasi errore, ma quando controllo la pagina di amministrazione, il post creato da CreateView non viene salvato nel database .. Qualche idea .. ??

Grazie

+0

provare a fare 'form.save()' prima quindi chiamare il super !!! se questo aiuta –

+0

ho provato il tuo codice e funziona per me. C'è qualcos'altro Dopo averlo salvato ti reindirizza all'elenco dei post o al modulo di nuovo? – sneawo

+0

'form.save()' dovrebbe essere chiamato da 'super' in ogni caso dal momento che sta usando un ModelForm –

risposta

6

Un consiglio: non usare exclude al momento di definire le forme, utilizzare fields, è più sicuro e il modo consigliato di farlo.

Il reindirizzamento è definito dal metodo get_success_url. Se nel modello è presente il metodo get_absolute_urlCreateView reindirizzare a tale URL, altrimenti è sempre possibile ignorare get_success_url nella visualizzazione.

Utilizzando get_absolute_url:

class Post(models.Model): 
    user = models.ForeignKey(User) 
    post_title = models.CharField(max_length=200) 
    post_content = models.CharField(max_length=500) 
    post_date = models.DateTimeField('date posted') 

    @permalink 
    def get_absolute_url(self): 
     return ('myurlname',(), {'myparam': something_useful}) 

Utilizzando get_success_url:

class PostCreate(CreateView): 
    template_name = 'app_blog/post_save_form.html' 
    model = Post 
    form_class = PostForm 

    def form_valid(self, form): 
     form.instance.user = self.request.user 
     form.instance.post_date = datetime.now() 
     form.save() 
     return super(PostCreate, self).form_valid(form) 

    def get_success_url(self): 
     return reverse('myurlname', args=(somethinguseful,)) 

penso troverete questa pagina molto utile quando si lavora con CBVS: http://ccbv.co.uk/projects/Django/1.5/django.views.generic.edit/CreateView/

0

I t questo è un semplice caso di non chiamare form.save(). Quando il modulo viene convalidato, tutti i controlli vengono eseguiti, ma in realtà non salva l'oggetto nel database. Per farlo, devi esplicitamente comunicarlo tramite il metodo save().

Così si vuole:

class PostCreate(CreateView): 
    template_name = 'app_blog/post_save_form.html' 
    model = Post 
    form_class = PostForm 

    def form_valid(self, form): 
     form.instance.user = self.request.user 
     form.instance.post_date = datetime.now() 
     form.save() 
     return super(PostCreate, self).form_valid(form) 
1

il problema è che si sta escludendo i campi che sono obbligatorie, in modo da non passare attraverso il validazione dei form.

Si dovrebbe passare questi campi nascosti con un certo valore di default, lasciare che l'uso riempirli, impostato su null = True o popolano loro prima di accedere form_valid

Problemi correlati