Django ModelFormSets
Django中的ModelFormsets是一种处理使用一个模型创建的多个表单的高级方式,并使用它们来创建模型实例。换句话说,ModelFormsets是Django中的一组表单。人们可能想在一个页面上初始化多个表单,所有这些表单可能涉及多个POST请求,例如
class GeeksModel(models.Model):
title = models.CharField(max_length = 200)
description = models.TextField()
现在,如果想为这个模型创建一个modelformset,需要使用modelformset_factory。表单集是一个抽象层,用于在同一个页面上处理多个表单。它可以被比作是一个数据网格。
from django.forms import formset_factory
GeeksFormSet = modelformset_factory(GeeksModel)
创建和使用Django ModelFormsets
用一个例子说明手动渲染Django ModelFormsets的情况。考虑一个名为geeksforgeeks的项目,有一个名为geeks的应用程序。
在你的geeks应用程序中,创建一个名为models.py的新文件,你将在其中创建所有的模型。要创建一个Django模型,你需要使用Django模型。让我们来演示一下。
在你的models.py中输入以下内容。
# import the standard Django Model
# from built-in library
from django.db import models
# declare a new model with a name "GeeksModel"
class GeeksModel(models.Model):
# fields of the model
title = models.CharField(max_length = 200)
description = models.TextField()
# renames the instances of the model
# with their title name
def __str__(self):
return self.title
让我们解释一下到底发生了什么,左边表示字段的名称,右边则是相应地定义输入字段的各种功能。一个字段的语法被表示为
语法 :
Field_name = models.FieldType(attributes)
现在要为这个表单创建一个简单的表单集,移动到views.py并创建一个formet_view,如下所示。
from django.shortcuts import render
# relative import of forms
from .forms import GeeksForm
# importing formset_factory
from django.forms import formset_factory
def formset_view(request):
context ={}
# creating a formset
GeeksFormSet = modelformset_factory(GeeksForm)
formset = GeeksFormSet()
# Add the formset to context dictionary
context['formset']= formset
return render(request, "home.html", context)
为了通过HTML渲染表单集,创建一个HTML文件 “home.html”。现在让我们编辑模板 > home.html
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ formset.as_p }}
<input type="submit" value="Submit">
</form>
所有的设置都是为了检查我们的表单集是否工作,让我们访问http://localhost:8000/ 。
我们的modelformset已经完全工作了。让我们来学习如何修改这个表单集以使用这个表单集的额外功能。
如何使用Django ModelFormsets创建多个表单
Django表单集是用来处理一个表单的多个实例的。人们可以使用Django表单集的额外属性轻松创建多个表单。在 geeks/views.py ,
from django.shortcuts import render
# relative import of forms
from .models import GeeksModel
# importing formset_factory
from django.forms import modelformset_factory
def modelformset_view(request):
context ={}
# creating a formset and 5 instances of GeeksForm
GeeksFormSet = modelformset_factory(GeeksModel, fields =['title', 'description'], extra = 3)
formset = GeeksFormSet()
# Add the formset to context dictionary
context['formset']= formset
return render(request, "home.html", context)
关键字参数extra使同一表格有多个副本。如果一个人想创建5个表单,输入extra = 5,其他也是如此。访问http://localhost:8000/,检查是否创建了5个表格。
使用Django表单集处理多个表单
创建一个表单比在后端处理输入这些字段的数据要容易得多。让我们试着演示一下如何在视图中轻松使用模型表单集的数据。当试图处理表单集时,Django表单集需要一个额外的参数 {{ formset.management_data }}。
在templates/home.html ,
<form method="POST" enctype="multipart/form-data">
<!-- Management data of formset -->
{{ formset.management_data }}
<!-- Security token -->
{% csrf_token %}
<!-- Using the formset -->
{{ formset.as_p }}
<input type="submit" value="Submit">
</form>
现在要检查数据是如何被呈现的,以及什么类型的数据,编辑formet_view来打印数据。在 geeks/view.py ,
from django.shortcuts import render
# relative import of forms
from .forms import GeeksForm
# importing formset_factory
from django.forms import formset_factory
def formset_view(request):
context ={}
# creating a formset and 5 instances of GeeksForm
GeeksFormSet = formset_factory(GeeksForm, extra = 3)
formset = GeeksFormSet(request.POST or None)
# print formset data if it is valid
if formset.is_valid():
for form in formset:
print(form.cleaned_data)
# Add the formset to context dictionary
context['formset']= formset
return render(request, "home.html", context)
现在让我们尝试通过http://localhost:8000/,在表单组中输入数据
点击提交,数据将被保存在服务器运行的GeeksModel中。现在人们可以以任何方式方便地使用这些数据。