UpdateView 创建新的 objects 而不是更新它们
UpdateView creates new objects instead of updating them
正如标题所说,当我尝试使用具有多个 Child 模型的 Parent 模型的 UpdateView 来更新它们时,它不是简单地更新它们,而是创建新的 objects 而不是更新它们。我不应该对表格、模型或任何东西有问题,因为其他一切都在工作,我可以编辑 Parent 模型,但问题似乎出在我的 form_valid() 方法上views.py。这是相关代码:
(Entrada = Parent 模型,BalaMateriesPrimeres = 多个 Child 模型)
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)
编辑:
我也尝试过的事情:
这也复制了 objects
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()
好像我漏掉了一块拼图,但我想不通是什么
您通过在该方法中手动创建表单实例绕过了 UpdateView 的功能。没有理由这样做;您已经拥有表单,并在该方法中作为参数传递。删除方法的前三行。
并且您还可以删除 is_valid()
检查;根据定义,只有当表单已经有效时才会调用该方法。
正如标题所说,当我尝试使用具有多个 Child 模型的 Parent 模型的 UpdateView 来更新它们时,它不是简单地更新它们,而是创建新的 objects 而不是更新它们。我不应该对表格、模型或任何东西有问题,因为其他一切都在工作,我可以编辑 Parent 模型,但问题似乎出在我的 form_valid() 方法上views.py。这是相关代码:
(Entrada = Parent 模型,BalaMateriesPrimeres = 多个 Child 模型)
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)
编辑: 我也尝试过的事情:
这也复制了 objects
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()
好像我漏掉了一块拼图,但我想不通是什么
您通过在该方法中手动创建表单实例绕过了 UpdateView 的功能。没有理由这样做;您已经拥有表单,并在该方法中作为参数传递。删除方法的前三行。
并且您还可以删除 is_valid()
检查;根据定义,只有当表单已经有效时才会调用该方法。