2016-03-03 46 views
2

我在Django是新的(1.9)NOT NULL約束失敗時保存的ModelForm

我有,當我救我的ModelForm,我不明白爲什麼一個NOT NULL約束失敗...

我建議給用戶一個表來發表評論和唯一的領域包括形式爲「文本」,我想驗證後設置在我看來,排除字段並保存在數據庫之前

Models.py:

class Commentaire(models.Model): 
    text = RichTextField() 
    pub_date = models.DateTimeField() 
    author = models.ForeignKey(User) 
    post = models.ForeignKey(Post) 
    publish = models.BooleanField() 

    def __str__(self): 
     return "/%s/%s" % (self.pub_date,self.author.username) 

    class Meta: 
     ordering = ["-pub_date"] 

Forms.py:

class CommentaireForm(forms.ModelForm): 
    class Meta: 
     model = Commentaire 
     fields = ['text'] 

Views.py:

class PostDetail(View): 

    def get(self, request, *args, **kwargs): 
     view = PostDisplay.as_view() 
     return view(request, *args, **kwargs) 

    def post(self, request, *args, **kwargs): 
     view = PostComment.as_view() 
     return view(request, *args, **kwargs) 

class PostDisplay(DetailView): 
    model = Post 

    def get_context_data(self, **kwargs): 
     context = super(PostDisplay, self).get_context_data(**kwargs) 

     context['form'] = CommentaireForm() 
     return context 

class PostComment(SingleObjectMixin, FormView): 
    template_name = 'blogengine/post_detail.html' 
    form_class = CommentaireForm 
    model = Post 

    def post(self, request, *args, **kwargs): 
     #if not request.user.is_authenticated(): 
     # return HttpResponseForbidden() 

     self.object = self.get_object()   
     form = self.get_form() 

     if form.is_valid(): 
      return self.form_valid(form) 
     else: 
      return self.form_invalid(form) 


    def form_valid(self, form): 
     """ 
     If the form is valid, redirect to the supplied URL 
     """ 
     form.save(commit=False) 
     form.post = self.object 
     form.author = self.request.user 
     form.pub_date = datetime.now() 
     form.publish = True 
     form.save() 

     return HttpResponseRedirect(self.get_success_url()) 

當Django保存表單,我有這樣的例外:

NOT NULL約束失敗:blogengine_commentaire.pub_date

我爲排除的fie設置的值「form_valid」中的lds(作者,帖子,pub_date)沒有被考慮在內,他們似乎保持NULL

你能解釋我爲什麼因爲我迷路了嗎?

感謝

+0

*你在PostDetail做什麼?那個班的重點是什麼? –

+0

嗨,我嘗試按照Django Doc的示例構建CBV來管理DetailView和From:https://docs.djangoproject.com/fr/1.9/topics/class-based-views/mixins/ – Nizaleto

回答

3

你需要重寫form_valid方式類似

def form_valid(self, form): 
    """ 
    If the form is valid, redirect to the supplied URL 
    """ 
    model_instance = form.save(commit=False) 
    model_instance.post = self.object 
    model_instance.author = self.request.user 
    model_instance.pub_date = datetime.now() 
    model_instance.publish = True 
    model_instance.save() 
    return HttpResponseRedirect(self.get_success_url()) 

因爲save(commit=False)將返回一個Post實例然後需要來填充和保存。

+0

謝謝它的工作很多! – Nizaleto

+0

@Nizaleto如果你覺得它解決了你的問題,你可以接受答案,所以人們會看到問題解決了。 –

+0

我是Django的新手,也許我的CBV和Mixins開始太快了,官方文檔有點不完整......也許有一種最簡單的方法可以做,坦克再次用於分享你的知識 – Nizaleto

相關問題