使用inlineformset_factory(和crispy)

时间:2018-03-18 09:10:27

标签: python django django-crispy-forms

带有屏幕截图的示例项目:https://github.com/nspo/slowformsets-django-example

与作者,图书和出版商合作。

可以更新作者,您可以在其中更改作者拥有的所有图书以及添加新图书。 BookForms是使用inlineformset_factory创建的。书籍也有一个外键引用(发布者),可以在BookForm中选择。

渲染:

{% crispy form %}
{% crispy formset formset.form.helper %}

问题:

  • 对于每个BookForm,似乎都有对所有发布者的请求。

有点了解发布者的请求,因为可以在隐式的ModelChoiceField中选择它们。但是,我不能用prefetch_related加快速度吗?我有一种感觉,在view.py的第12行和第13行传递的作者实例可能被复制"那么任何预取的数据都会被遗忘?

如果没有直接解决方案B / c的ModelChoiceField限制,如果在添加Book(但仅显示)后无法更改Publisher,则它也适用于我的情况。虽然没有太多变化,但不知道如何做到这一点。

1 个答案:

答案 0 :(得分:1)

我们看不到任何能够制作这种猜谜游戏的代码。你提到prefetch_related但它没有显示在你链接的代码中。一般来说,我会做这样的事情

queryset=Book.objects.prefetch_related('publisher').filter(author=id_author)
BookInlineFormSet = inlineformset_factory(Author, Book, form=BookForm, extra=2, can_delete=False)
bookformset = BookInlineFormSet(instance=author, prefix="main", queryset=queryset)

我也猜测每本书都有一个出版商。所以它不会是prefetch_related而是select_related。