我有一个模型Book,它在模型库中有一个ForeignKey。图书馆里可以有多本书。由于每本书的信息都很简短(作者,年龄,成本),我想在一个表格中列出图书馆中的所有书籍,并让用户能够一次更新所有3个字段。有一个date
字段和一个library_id
字段,用于确定每天将哪些图书添加到图书馆。我们假设当前表格中不能添加新书。
class Library(models.Model):
user ...
library_id = models.CharField(max_length=120, blank=True)
updated = models.DateTimeField(auto_now=True)
class Book(models.Model):
library_id = models.ForeignKey(Library)
date = models.DateField(default=None, blank=True, null=True)
author = models.CharField(max_length=50, blank=True)
age = models.IntegerField(default=0, min=0)
cost = models.DecimalField(default=0.00, max_digits=100, decimal_places=2)
updated = models.DateTimeField(auto_now=True)
class Meta:
unique_together = (('library_id ', 'date'),)
我希望能够为特定图书馆选择日期,并能够一次更新所有图书的所有信息。这意味着在后端,我将更新Book
类中的多个记录。我发现它存在:inlineformset_factory
,但当我尝试使用它时(见下文),我仍然只能获得一个表单。
forms.py
class LibraryChangeForm(forms.ModelForm):
class Meta:
model = Book
exclude = ['updated']
BookFormSet = inlineformset_factory(Library, Book, exclude = ['updated'])
views.py
class LibraryUpdateView(LoginRequiredMixin, UpdateView):
model = Library
form_class = LibraryChangeForm
def get_context_date(self, **kwargs):
context = super(LibraryUpdateView, self).get_context_data(**kwargs)
context['form'] = LibraryChangeForm(self.request.POST, instance=self.object)
context['book_form'] = BookFormSet(self.request.POST, instance=self.object)
return context
html - 仅{{form}}
和{{form.as_p}}
工作
{% extends "base.html" %}
{% block content %}
{{form}}
{{book_form}}
{{form.as_p}}
{{form2}}
{% endblock %}
简而言之,我想迭代特定库/日期的所有实例,并让用户一次更新所有实例。
答案 0 :(得分:0)
首先LibraryChangeForm
应该有模型Library
,因为它用于更新库实例
class LibraryChangeForm(forms.ModelForm):
class Meta:
model = Library
exclude = ['updated']
其次,要在视图中显示formset,您可以迭代所有formset的形式:
<form method="post">
{{form}}
{{ book_form.management_form }}
<table>
{% for book_form in book_form %}
{{ book_form }}
{% endfor %}
</table>
</form>
这将在同一模板上呈现LibraryChangeForm
和BookFormset
。