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