📜  Django 表单集

📅  最后修改于: 2022-05-13 01:54:19.184000             🧑  作者: Mango

Django 表单集

Django 中的表单集是一种在单个网页上处理多个表单的高级方法。换句话说,Formsets 是 Django 中的一组表单。一个人可能想在一个页面上初始化多个表单,所有这些都可能涉及多个 POST 请求,例如

from django import forms
class GeeksForm(forms.Form):
    title = forms.CharField()
    pub_date = forms.DateField()

现在可能希望允许用户一次创建文章,因此如果以传统方式考虑,则使用多个表单和每个表单的不同名称来处理单个页面上的数据,但这会使代码和功能复杂化。表单集是用于在同一页面上处理多个表单的抽象层。最好将其与数据网格进行比较。
现在创建这个GeeksForm的表单集,

from django.forms import formset_factory
GeeksFormSet = formset_factory(GeeksForm)

创建和使用 Django 表单集

使用示例手动呈现 Django 表单的插图。考虑一个名为geeks的项目,它有一个名为geeksforgeeks的应用程序。

在您的极客应用程序中创建一个名为 forms.py 的新文件,您将在其中制作所有表单。要创建 Django 表单,您需要使用 Django Form Class。让我们演示一下,
在你的forms.py输入以下内容,

from django import forms
  
# create a form
class GeeksForm(forms.Form):
    title = forms.CharField()
    description = forms.CharField()

让我们解释一下到底发生了什么,左侧表示字段的名称,在它的右侧,您相应地定义了输入字段的各种功能。字段的语法表示为
句法 :

Field_name = forms.FieldType(attributes)

现在要创建一个简单的表单集,移动到views.py并创建一个formset_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 = formset_factory(GeeksForm)
    formset = GeeksFormSet()
      
    # Add the formset to context dictionary
    context['formset']= formset
    return render(request, "home.html", context)

要通过 HTML 呈现表单集,请创建一个 html 文件“home.html”。现在让我们编辑templates > home.html

    {% csrf_token %}     {{ formset.as_p }}     

一切准备就绪,检查我们的表单集是否正常工作,让我们访问 http://localhost:8000/。
django-formsets .
我们的表单集完全正常工作。让我们学习如何修改此表单集以使用此表单集的额外功能。

如何使用 Django Formsets 创建多个表单

Django 表单集用于处理表单的多个实例。使用 Django Formsets 的extra属性可以轻松创建多个表单。在geeks/views.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 = 5)
    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-formsets-多种形式

使用 Django Formsets 处理多个表单

创建表单比在后端处理输入到这些字段中的数据要容易得多。让我们尝试演示如何在视图中轻松使用表单集的数据。在尝试处理表单集时,Django 表单集需要一个额外的参数{{ formset.management_data }} 。要了解有关管理数据的更多信息,请访问了解 ManagementForm。
templates/home.html中,

                {{ formset.management_data }}             {% csrf_token %}             {{ formset.as_p }}            

现在检查如何以及什么类型的数据正在呈现编辑formset_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/ 在表单集中输入数据
输入-formset-data-django-formsets
点击提交,数据将显示在服务器运行的命令行中。现在可以以任何方式方便地使用这些数据。
django-formsets-use-data1
Formset 是先进的东西,可用于解决许多问题,但应与正确的语法和字段验证一起使用,否则冲突和错误将破坏正常功能。要了解有关 Formsets 的更多信息,请访问 Formsets 的官方文档。