欢迎访问宙启技术站
智能推送

django formset实现数据表的批量操作的示例代码

发布时间:2023-05-15 12:11:33

Django的Formset是一种特殊的表单对象,它能够让你在一个表单中编辑多个模型对象。Formset是ModelFormset的简写,通常用于在表单中同时展示和编辑多个模型实例。

Example

我们假设有一个模型如下:

class Product(models.Model):
    name = models.CharField(max_length=50)
    description = models.CharField(max_length=250)
    price = models.DecimalField(max_digits=6, decimal_places=2)

但是,我们需要同时对多个产品进行批量价格修改。这时候就可以使用Django的Formset。

在views.py文件中添加如下代码:

from django.forms import formset_factory
from django.shortcuts import render
from .models import Product
from .forms import ProductForm

def edit_products(request):
    ProductFormSet = formset_factory(ProductForm, extra=0)
    if request.method == 'POST':
        formset = ProductFormSet(request.POST)
        if formset.is_valid():
            for form in formset:
                cd = form.cleaned_data
                product = form.instance
                product.price = cd['price']
                product.save()
    else:
        products = Product.objects.all()
        formset = ProductFormSet(queryset=products)
    return render(request, 'product/edit_products.html', {'formset': formset})

在上面的代码中,我们导入了formset_factory,Product,ProductForm类。其中,ProductForm是一个ModelForm,用于Product对象的表单输入。

edit_products方法中,我们利用formset_factory()函数将ProductForm转换为一个表单集合,然后检查用户提交的表单是否合法。如果表单合法,我们遍历每一个提交的表单,找到对应的产品对象,并将其价格更新为表单中提供的价格。

如果是GET请求,我们可以使用 queryset 关键字参数填充表单集合。它必须是一个内置QuerySet对象,此处是Product的全部对象。

在模板中,我们用for循环遍历每一个表单项,并将form作为参数传递给Product的price字段。

{% raw %}

<form method="post">
    {% csrf_token %}
    {{ formset.management_form }}
    <table>
        <thead>
            <tr>
                <th>Name</th>
                <th>Description</th>
                <th>Price</th>
            </tr>
        </thead>
        <tbody>
            {% for form in formset %}
            <tr>
                <td>{{ form.instance.name }}</td>
                <td>{{ form.instance.description }}</td>
                <td>{{ form.price }}</td>
            </tr>
            {% endfor %}
        </tbody>
    </table>
    <button type="submit">Save</button>
</form>

{% endraw %}

在模板中,我们使用formset.management_form好处是,它将处理我们的FormSet,确保可以为我们的表单创建 hidden input fields,这是formset工作必备的部分。

最后,我们使用formset管理方法来输出这些 hidden input fields, 它将FormSet中包含的表单处理,生成一个POST请求时需提交的所有表单数据。

总结

使用Django的Formset可以特别方便的进行批量操作。我们只需要创建一个表单,然后通过formset_factory转换为多个表单的集合。

在模板中,我们可以使用for循环来遍历所有的表单对象,并将实例对象的属性输出到HTML中。在视图中,我们需要遍历每个表单对象,并根据表单中的数据更新实例属性用户输入的新值。

要注意的是,在表单集合中,每个表单都应当对应模型中的一个对象。 在使用Queryset进行初始化时,表单的管理对象已经和查询集一一对应, 这时候form的.instance属性可以获得模型对象。

这是一个简单例子,我们可以在实际开发中使用 Formset 实现许多不同的操作,如批量删除、批量修改等,简单易行,值得推荐。