Django – 在单个视图中处理多个表单


有时我们需要在一个函数或视图中处理多个表单。在本文中,我们将了解如何编写一个函数,该函数可以同时在同一个视图中处理两个表单。这在许多情况下都非常方便;我们还将处理两个以上的表单。

创建一个 Django 项目和一个应用,我将项目命名为 "multipleFormHandle",应用命名为 "formhandlingapp"。

执行一些基本操作,例如在 settings.py 中的 INSTALLED_APPS 中包含应用,并在项目的 url 中包含应用的 url。

现在在应用中创建 forms.py,并在应用目录中创建一个 "templates" 文件夹。在 templates 中添加 home.html

安装 multi-form_view 库 -

pip install multi_form_view

示例

现在在应用的 urls.py 中 -

from django.urls import path,include
from . import views
urlpatterns = [
   path('',views.SchoolData.as_view(),name='home'),
]

在这里,我们设置了 views 并使用我们的 viewset 作为视图。我们将在这里使用 viewset

models.py 中 -

from django.db import models

# Create your models here.

class StudentData(models.Model):
   name=models.CharField(max_length=100)
   standard=models.CharField(max_length=100)
   section=models.CharField(max_length=100)

class TeachertData(models.Model):
   name=models.CharField(max_length=100)
   ClassTeacherOF=models.CharField(max_length=100)
   Salary=models.CharField(max_length=100)

我们创建了两个模型,因为我们将表单数据保存在模型中。

forms.py 中 -

from django import forms
from .models import TeachertData,StudentData

class StudentForm(forms.ModelForm):
   class Meta:
      model=StudentData
      fields="__all__"

class TeacherForm(forms.ModelForm):
   class Meta:
      model=TeachertData
      fields="__all__"

在这里,我们创建了模型表单,我们将在前端从我们的视图中渲染这些表单。

home.html 中 -

<!DOCTYPE html>
<html>
   <head>
      <title>tut</title>
   </head>
   <body>
      <form method="post" enctype="multipart/form-data">
         {% csrf_token %}

         <label><h3>Teacher</h3></label>
         //accessing form 1 from view
         {{ forms.teacher_form.as_p }}
         <label><h3>Student</h3></label>
         //accessing form 2 from view
         {{ forms.student_form.as_p }}
         <input type="submit" value="submit"/>
      </form>
   </body>
</html>

这是我们的前端,我们在单个表单元素下以及使用单个提交按钮渲染两个 Django 表单。

我不会添加样式,因为这里我们学习的是概念以及如何实现它。

views.py 中 -

from django.shortcuts import render
from .forms import StudentForm,TeacherForm
from django.views.generic.list import ListView
from django.urls import reverse

from multi_form_view import MultiModelFormView
# Create your views here.
class SchoolData(MultiModelFormView):
   form_classes = {
      'student_form' : StudentForm,
      'teacher_form' : TeacherForm,
   }
   template_name = 'home.html'
   def get_success_url(self):
      return reverse('home')
   def forms_valid(self, forms):
      student = forms['student_form'].save(commit=False)
      teacher=forms['teacher_form'].save(commit=False)
      return super(SchoolData, self).forms_valid(forms)

在这里,我们创建了一个 viewset,我们定义了两个要渲染的表单,一个是 学生表单,另一个是 教师表单。我们定义了要渲染的 HTML。我们在 get_success_url 中定义了提交表单时要执行的操作。在 form_valid 中,我们保存表单数据并验证两个表单是否都正确。

输出


更新于: 2021-08-26

5K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告