2017-01-11 3 views
0

Я пытаюсь создать сайт Q/A в Django, и у меня возникли проблемы с созданием окна обновления вопроса для приложения.Не удается обновить экземпляр модели в 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

У вас есть переопределенная 'почта' без всякой причины, и ваша логика ошибочна. Удалите этот метод, и класс будет делать то, что вы ожидаете. (За исключением того, что 'get_success_url' должен возвращать URL-адрес, а не делать перенаправление. –

ответ

1

Вы можете использовать form_valid вместо сообщения и получить много проверок, которые вы пытались сделать там бесплатно, а model.clean() называется частью процесса проверки формы.

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

Вы можете также сделать лучше позволить родительский класс обрабатывать заданы параметры по умолчанию для сохранения

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

Это может быть, что ваши update_fields = Никто не может быть предотвращение сохранения, см Django Model instance reference

EDIT в соответствии с комментарием, вы должны вернуть URL-адрес. Используйте reverse(), а не перенаправлять django.urls utility functions

+0

Я просто видел, что каждый раз, когда создается slug, pk не добавляется. Вместо этого добавляется« None ». Что может быть причиной? –

+0

Идентификатор не создается до тех пор, пока экземпляр не будет сохранен в первый раз. Вы можете либо добавить другой вызов для сохранения перед добавлением пула, либо попробовать обработчик сигнала 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() '. –