Django:如何通过表单编辑模型中的多行

时间:2018-06-18 03:33:51

标签: django django-models django-forms

我有一个模型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 %}

简而言之,我想迭代特定库/日期的所有实例,并让用户一次更新所有实例。

1 个答案:

答案 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>

这将在同一模板上呈现LibraryChangeFormBookFormset