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 中,我們儲存表單資料並驗證兩個表單是否都正確。
輸出
廣告