【问题标题】:Can't update the model instance in Django?无法在 Django 中更新模型实例?
【发布时间】:2017-01-11 11:53:58
【问题描述】:

我正在尝试在 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

代码有什么问题?每当我更新它创建的问题时,它都会创建一个新实例,而不是保存从表单类中获得的问题。

【问题讨论】:

  • 你无缘无故地覆盖了post,你的逻辑是错误的。删除该方法,该类将执行您期望的操作。 (除了 get_success_url 应该返回 URL,而不是重定向。

标签: django django-models django-views django-queryset


【解决方案1】:

您可以使用 form_valid 代替 post 并免费获得许多您尝试过的检查,并且在表单验证过程中调用 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=None 阻止了保存,请参阅Django Model instance reference

根据评论编辑,您应该返回一个 URL。使用 reverse() 而不是重定向django.urls utility functions

【讨论】:

  • 我刚刚看到每次创建slug时,都没有附加pk。而是附加了“无”。可能是什么原因???
  • 第一次保存实例后才会创建id。您可以在添加 slug 之前再次调用 save ,或者尝试使用 post_save 信号处理程序。 docs.djangoproject.com/en/1.10/ref/signals/#post-save
  • 这项工作是否有效:super().save(commit=False) self.slug = slugify(self.title)+'-'+str(self.id) super().save().
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-15
  • 2022-01-24
  • 2014-09-27
相关资源
最近更新 更多