簡體   English   中英

Django Formset中的必填字段和可選字段

[英]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})

這是我嘗試過的步驟:

  1. 如果我刪除了“ required = False”,它將使表格中的每個表格都符合要求。 如果用戶僅填寫第一組並將第二組留空,則將標記KeyError。
  2. 如果用戶提交了空白表單,則像上面一樣將此表單集設置為可選表單也會引發KeyError。

添加姓名表格

KeyError-名字=形式['first_name'

在這種情況下,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM