Django:双嵌套表单的UpdateView

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?