2013-07-24 8 views
5

Ich übe django Class-Based-View mit einer grundlegenden Blog-Anwendung. Aus irgendeinem Grund speichert das CreateView für mein Post-Modell den Post jedoch nicht in der Datenbank.Django CreateView speichert kein Objekt

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) 

Es zeigt Inhalt wi Wenn ich die Admin-Seite überprüfe, wird der von CreateView erstellte Beitrag nicht in der Datenbank gespeichert. Irgendeine Idee .. ??

Dank

+0

versuchen zu tun 'form.save()' zuerst die dann rufen super !!! Wenn das hilft –

+0

Ich habe versucht, Ihren Code und es funktioniert für mich. Da ist noch etwas. Nach dem Speichern leitet es Sie zur Posts List oder Post Formular weiter? – sneawo

+0

'form.save()' sollte sowieso von 'super' aufgerufen werden, da er ein ModelForm verwendet –

Antwort

6

Ein Tipp: Sie exclude nicht verwenden, wenn Formulare zu definieren, verwenden Sie fields, ist sicherer und der empfohlene Weg, es zu tun.

Die Umleitung ist definiert durch get_success_url Methode. Wenn Sie in Ihrem Modell die Methode get_absolute_urlCreateView haben wird umleiten, um diese URL, sonst können Sie immer get_success_url in Ihrer Ansicht überschreiben.

Mit 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}) 

Mit 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,)) 

Ich glaube, Sie diese Seite sehr nützlich finden werden, wenn sie mit CBVS arbeiten: http://ccbv.co.uk/projects/Django/1.5/django.views.generic.edit/CreateView/

0

I t hink Dies ist ein einfacher Fall von form.save() nicht aufrufen. Wenn das Formular überprüft wird, sind alle Überprüfungen abgeschlossen, das Objekt wird jedoch nicht tatsächlich in der Datenbank gespeichert. Um dies zu tun, müssen Sie es explizit über die Methode save() mitteilen.

Sie wollen also:

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

das Problem ist, dass Sie Felder ohne die obligatorisch sind, so wird es nicht durch Ihre Formularvalidierung übergeben.

sollten Sie diese Felder mit einigen Standardwert versteckt passieren, lassen die ihnen Gebrauch füllen, setzen Sie sie = True auf null oder sie füllen, bevor Sie form_valid zugreifen