Django:双嵌套表单的UpdateView

问题描述

我目前在为双重嵌套表单编写UpdateView时出错。我的体系结构由一个包含一个表单和两个表单集的模板组成。发行商有一个很大的形式。然后,某人可以根据需要添加任意数量的作者表单集,并根据需要向每个作者添加任意数量的书表单集。看起来像这样:

  • 发布者-> Author1,Author2,Author3,...
  • 作者1->书1,书2,书3
  • Author2-> Book4
  • Author3-> Book5,Book6

同样,所有这些都列在一个create.html模板中。我使用CreateView编写了此文件效果很好。现在编写UpdateView, 我重定向到用于创建表单的html模板,并且可以使用发布者和作者的数据正确填充表单。但是,当我尝试用书籍数据填充表单时,它将使用相同的书籍实例填充每个作者实例,而不是使用匹配的书籍实例填充每个作者实例。看起来像这样:

  • 发布者-> Author1,Author2,Author3,...
  • 作者1->书1,书2,书3
  • Author2-> Book1,Book2,Book3
  • Author3-> Book1,Book2,Book3

我的models.py看起来像:

class Publisher(models.Model):
    name = models.CharField(max_length=255,unique=True)

class Author(models.Model):
    name = models.CharField(max_length=255,unique=True) 
    publisher = models.ForeignKey(Publisher,on_delete=models.CASCADE)

class Book(models.Model):
    title = models.CharField(max_length=255,unique=True)
    author = models.ForeignKey(Author,on_delete=models.CASCADE) 

我的forms.py看起来像:

AuthorInlineFormSet = inlineformset_factory(
    Publisher,Author,fields="__all__",extra=1,can_delete=False,)

BookInlineFormSet = inlineformset_factory(
    Author,Book,)

我的views.py如下:

class FormCreateView(CreateView):
    model = Publisher
    template_name = 'reservations/create.html'
    fields = "__all__"

    def form_valid(self,form):
        result = super(FormCreateView,self).form_valid(form)

        authors_count = 0
        authors_formset = AuthorInlineFormSet(form.data,instance=self.object,prefix='authors_formset')
        if authors_formset.is_valid():
            authors = authors_formset.save()

            for author in authors:
                books_formset = BookInlineFormSet(form.data,instance=author,prefix='books_formset_%s' % authors_count)
                if books_formset.is_valid():
                    books_formset.save()
                authors_count += 1
        return result

    def get_context_data(self,**kwargs):
        context = super(FormCreateView,self).get_context_data(**kwargs)
        context['authors_formset'] = AuthorInlineFormSet(prefix='authors_formset')
        context['books_formset'] = BookInlineFormSet(prefix='books_formset_0')
        return context

class FormUpdateView(UpdateView):
    model = Publisher 
    template_name = 'reservations/create.html'
    fields = "__all__"

    def get_success_url(self):
        return reverse_lazy('reservations:dashboard')

    def get_object(self,*kargs,**kwargs):
        request = get_object_or_404(Publisher,pk=self.kwargs['pk'])

        return request

    def get_context_data(self,**kwargs):
        context = super(FormUpdateView,self).get_context_data(**kwargs)
        context['authors_formset'] = AuthorInlineFormSet(instance=self.object,prefix='authors_formset')
        authors_count = 0
        authors_formset = AuthorInlineFormSet(instance=self.object,prefix='authors_formset')
        authors_formset = authors_formset.queryset
        for author in authors_formset:
            context['books_formset'] = BookInlineFormSet(instance=author,prefix='books_formset_%s' % authors_count)
        return context 

现在,如果我要在UpdateView的get_context_data的for循环中打印出context ['books_formset'],它会正确打印出每个作者的匹配书形集,因此它将打印出来(Book5,Book6) Book4),然后(Book1,Book2,Book3)。因此,我知道它正在为每个作者实例正确找到相应的书籍实例。但是,它随后将所有书实例写入Book1,Book2,Book3,因此每个作者都有Book1,Book2,Book3。我不太确定如何解决此问题,将不胜感激!非常感谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)