【问题标题】:Django: How to edit multiple rows in a model via formsDjango:如何通过表单编辑模型中的多行
【发布时间】:2018-06-18 03:33:50
【问题描述】:

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

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

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

    首先LibraryChangeForm 应该有模型Library,因为它用于更新库实例

    class LibraryChangeForm(forms.ModelForm):
        class Meta:
            model = Library
            exclude = ['updated']
    

    其次要在视图中显示表单集,您可以遍历所有表单集的表单:

    <form method="post">
        {{form}}   
        {{ book_form.management_form }}
        <table>
            {% for book_form in book_form %}
            {{ book_form }}
            {% endfor %}
        </table>
    </form>
    

    这将在同一模板上同时呈现:LibraryChangeFormBookFormset

    【讨论】:

      猜你喜欢
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 2011-08-26
      • 2018-10-26
      • 2018-04-27
      • 2020-04-18
      • 2020-04-17
      相关资源
      最近更新 更多