2017-01-11 13 views
0

私はDjangoでQ/Aウェブサイトを作ろうとしていますが、そのアプリの質問の更新ビューを作成する際に問題があります。ここで Djangoでモデルインスタンスを更新できませんか?

はQuestionUpdateViewクラス

class QuestionUpdateView(UpdateView): 
    model = models.Question 
    form_class = forms.QuestionForm 
    template_name = 'Questionnaire/form.html' 
    success_url = 'question:details' 

    def get_success_url(self, **kwargs): 
     return redirect(self.success_url, self.kwargs['slug']) 

    def post(self, request, *args, **kwargs): 
     filled_form = self.form_class(request.POST) 
     if self.form_class.is_valid(filled_form): 
      model = filled_form.save(commit=False) 
      model.clean() 
      model.save() 
      return self.get_success_url(slug=model.slug) 

であり、ここで質問モデル

class Question(models.Model): 
    title = models.CharField(max_length=250) 
    body = models.TextField() 
    asked_by = models.ForeignKey(User) 
    pub_date = models.DateTimeField(auto_now_add=timezone.now) 
    slug = models.SlugField(max_length=250, unique=True, default=None) 
    likes = models.PositiveIntegerField(editable=False, default=0) 
    dislikes = models.PositiveIntegerField(editable=False, default=0) 

    def save(self, force_insert=False, force_update=False, using=None, 
      update_fields=None): 
     if self.slug is None: 
      self.slug = slugify(self.title)+'-'+str(self.id) 
     super(Question, self).save(force_insert, force_update, using, update_fields) 

    def get_absolute_url(self): 
     return reverse('question:details', kwargs={'slug': self.slug}) 

    def __str__(self): 
     return self.title 

コードの問題は何かがありますか?質問を更新するたびに、フォームクラスから取得したものを保存するのではなく、新しいインスタンスが作成されます。

+0

あなたは何の理由もなく 'post'をオーバーライドしました。あなたのロジックは間違っています。そのメソッドを削除すると、クラスは期待したことを行います。 (ただし、 'get_success_url'はURLを返すべきで、リダイレクトはしません。 –

答えて

1

投稿の代わりにform_validを使用して、あなたが自由にしようとした多くのチェックを取得し、model.clean()をフォーム検証プロセスの一部として呼び出すことができます。それはあなたのupdate_fieldsは=なし参照、保存Django Model instance reference

EDITを防止できなかったことが考えられ

def save(self, *args, **kwargs): 
    if self.slug is None: 
     self.slug = slugify(self.title)+'-'+str(self.id) 
    super(Question, self).save(*args, **kwargs) 

保存のためにあなたはまた、より良い親クラスがデフォルトarguementsを処理せないこと

def form_valid(form): 
    form.save() 
    return self.get_success_url(slug=model.slug) 

コメントごとにURLを返す必要があります。 django.urls utility functions

+0

私は、スラッグが作成されるたびにpkが付加されていないことを見たのですが、代わりに「None」が追加されました。 –

+0

idは、インスタンスが初めて保存されるまで作成されません。slugを追加する前に、別のsaveを呼び出して呼び出すか、post_saveシグナルハンドラを試してみてください。https://docs.djangoproject.com/en /1.10/ref/signals/#post-save – Andee

+0

これは動作しますか? 'super()。save(commit = False)' 'self.slug = slugify(self.title)+ ' - ' + str(self.id) '' super()。save() 'を実行します。 –

関連する問題