📜  Django 模型表单集

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

Django 模型表单集

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的插图。考虑一个名为geeks的项目,它有一个名为geeksforgeeks的应用程序。

在您的 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并创建一个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 = modelformset_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-modelformsets

我们的modelformset正在完全工作。让我们学习如何修改此表单集以使用此表单集的额外功能。

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

Django 表单集用于处理表单的多个实例。使用 Django Formsets 的extra属性可以轻松创建多个表单。在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-modelfornsets-extra-keyword

使用 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/ 在表单集中输入数据
django-modelformsets-use-data

点击提交,数据将保存在服务器运行的 GeeksModel 中。现在可以以任何方式方便地使用这些数据。
django-model-formset-result