【问题标题】:UpdateView creates new objects instead of updating themUpdateView 创建新对象而不是更新它们
【发布时间】:2018-10-25 02:10:40
【问题描述】:

正如标题所说,当我尝试使用具有多个子模型的父模型的 UpdateView 来更新它们时,而不是简单地更新它们,它会创建新对象而不是更新它们。我不应该对表单、模型或任何东西有问题,因为其他一切都在工作,我可以编辑父模型,但问题似乎出在我的 views.py 的 form_valid() 方法上强>。以下是相关代码:

(Entrada = 父模型,BalaMateriesPrimeres = 多个子模型)

class EntradaUpdateView(LoginRequiredMixin, UpdateView):
    model = Entrada
    fields = [...]
    template_name_suffix = '_update'

    def form_valid(self, form):
        self.object = self.get_object()
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        qs = BalaMateriesPrimeres.objects.filter(num_entrada=self.get_object())
        formsets = BalaMateriesPrimeresFormSet(self.request.POST, queryset=qs)

        if form.is_valid():
            form.save()
            if formsets.is_valid():
                instances = formsets.save(commit=False)
                for instance in instances:
                    instance.instance = self.object
                    instance.num_entrada = Entrada.objects.get(pk=self.object.id)
                    instance.save()
       return super(EntradaUpdateView, self).form_valid(form)

编辑: 我也尝试过的事情:

  • 这也复制了对象

    self.object = self.get_object()
    form_class = self.get_form_class()
    form = self.get_form(form_class)
    qs = BalaMateriesPrimeres.objects.filter(num_entrada=self.get_object())
    formsets = BalaMateriesPrimeresFormSet(self.request.POST, queryset=qs)
    
    if form.is_valid():
        form.save()
        if formsets.is_valid():
            instances = formsets.save(commit=False)
            for instance in instances:
                instance.instance = self.object
                instance.num_entrada = Entrada.objects.get(pk=self.object.id)
                instance.save()
    
  • 这只是不保存任何东西:

    self.object = self.get_object()
    form_class = self.get_form_class()
    form = self.get_form(form_class)
    qs = BalaMateriesPrimeres.objects.filter(num_entrada=self.get_object())
    formsets = BalaMateriesPrimeresFormSet(self.request.POST, queryset=qs)
    
    if form.is_valid():
        form.save()
        for formset in formsets:
            if formsets.is_valid():
                formset.instance = self.object
                formset.num_entrada = self.object.id
                print(formset.instance)
                formset.save()
    

    好像我错过了一块拼图,但我不知道是什么

【问题讨论】:

  • 我不明白你为什么“尝试”了那些其他的事情,而不是使用我的答案来解决问题。
  • 因为在你回复这个帖子之前我已经尝试过这些东西

标签: django django-forms django-views formsets


【解决方案1】:

您通过在该方法中手动创建表单实例绕过了 UpdateView 的功能。没有理由这样做;您已经有了表单,在该方法中作为参数传递。删除方法的前三行。

你也可以去掉is_valid()检查;根据定义,只有当表单已经有效时才会调用该方法。

【讨论】:

    猜你喜欢
    • 2015-07-26
    • 2017-02-19
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多