[英]Required and Optional Field in Django Formset
我創建了一個表單集來復制兩個輸入字段,名字和姓氏。 我想使第一組“名字”和“姓氏”字段為必填字段,而第二和第三組為可選字段。 換句話說,必須填寫三組輸入框中的至少一個。 有沒有辦法做到這一點? 我是否必須制作2個單獨的表單/表單集才能適應此要求?
我提出這個問題的原因是我想擁有3組名字和姓氏字段。 如果用戶僅填寫三組中的一組,然后單擊提交,則Django將拋出“ 密鑰錯誤”,因為未填寫其他兩組。
表格
from django import forms
class NameForm (forms.Form):
first_name = forms.CharField (max_length = 20, required = False)
last_name = forms.CharField (max_length = 20, required = False)
views.py
from django.shortcuts import render
from django.forms.formsets import formset_factory
from nameform.forms import NameForm
from nameform.addName import webform
# Create your views here.
def addname (request):
NameFormSet = formset_factory (NameForm, extra = 2, max_num = 5) # Set maximum to avoid default of 1000 forms.
if request.method == 'POST':
# Django will become valid even if an empty form is submitted. Adding initial data causes unbound form and
# trigger formset.errors
formset = NameFormSet (request.POST, initial = [{'first_name': 'John', 'last_name': 'Doe'}])
if formset.is_valid ():
location = request.POST ['site']
data = formset.cleaned_data
for form in data:
firstname = form ['first_name']
lastname = form ['last_name']
webform (firstname, lastname, location)
context = {'data': data, 'location': location}
return render (request, 'nameform/success.html', context)
else:
formset = NameFormSet ()
return render (request, 'nameform/addname.html', {'formset': formset})
這是我嘗試過的步驟:
在這種情況下,Django表單集以一種特殊的方式工作-沒有數據的表單具有空的cleaned_data
但被視為有效。 因此,您必須手動檢查表單數據是否存在:
# at imports section of views.py
from django.forms.util import ErrorList
# at addname()
actual_data = []
for form in data:
firstname = form.get('first_name')
lastname = form.get('last_name')
if firstname and lastname:
webform (firstname, lastname, location)
actual_data.append(form)
if actual_data:
context = {'data': actual_data, 'location': location}
return render(request, 'nameform/success.html', context)
formset._non_form_errors = ErrorList(['Enter at least one person name.'])
您需要繼承自BaseFormSet並重寫“ clean”方法以實現手動驗證。
django文檔有一個示例: https : //docs.djangoproject.com/en/1.7/topics/forms/formsets/#custom-formset-validation
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.