UpdateView создает новые объекты, а не обновляет их - PullRequest
0 голосов
/ 15 мая 2018

Как видно из заголовка, когда я пытаюсь использовать UpdateView родительской модели с несколькими дочерними моделями для их обновления, вместо того, чтобы просто обновлять их, он создает новые объекты вместо их обновления.У меня не должно быть проблем с формой, моделями или чем-то еще, потому что все остальное работает, и я могу редактировать родительскую модель, но проблема, похоже, заключается в методе form_valid () моего views.py .Вот соответствующий код:

(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()
    

    Похоже, я 'Мне не хватает части головоломки, но я не могу понять, что

1 Ответ

0 голосов
/ 15 мая 2018

Вы обошли функциональность UpdateView, вручную создав экземпляр формы в этом методе.Нет причин делать это;у вас уже есть форма, переданная в качестве параметра в этом методе.Удалите первые три строки метода.

И вы также можете удалить проверку is_valid();по определению этот метод вызывается только в том случае, если форма уже действительна.

...