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+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告