15

私が必要とするフォームの 1 つは、単純なフィールド (「Department」、「Building」、「RoomNumber」など) と、動的に生成されたフィールドのペア (「Name」と「Email」など) の複合です。単純なフィールドの内容の編集と動的フィールドのペアの追加/削除は、1 つのフォームで行うのが理想的です。

コードに関しては、(2 つの動的フィールドを持つフォームの) フォームセットを通常のフォームのフィールドとして埋め込もうとするのが賢明なアプローチなのか、それとも私が達成したいことを達成するための別のベスト プラクティスがあるのか​​疑問に思っています。 .

これらの問題についてアドバイスをいただき、ありがとうございます。

4

1 に答える 1

20

「フォームセットをフィールドとして埋め込む」必要があるという考えがどこから来たのかわかりません。これは、フォームセットの標準的な使用法のケースのように思えます。

例(モデルについて多くの仮定を立てる):

class OfficeForm(forms.Form):
  department = forms.ModelChoiceField(...
  room_number = forms.IntegerField(...

class StaffForm(forms.Form):
  name = forms.CharField(max_length=...
  email = forms.EmailField(...

from django.forms.formsets import formset_factory

StaffFormSet = formset_factory(StaffForm)

そして、あなたの見解のために:

def add_office(request):
    if request.method == 'POST':
        form = OfficeForm(request.POST)
        formset = StaffFormSet(request.POST)

        if form.is_valid() && formset.is_valid():
            # process form data
            # redirect to success page
    else:
        form = OfficeForm()
        formset = StaffFormSet()

    # render the form template with `form` and `formset` in the context dict

考えられる改善:

  • django-dynamic-formset jQuery プラグインを使用して、ユーザーに毎回空白のフォームのスタックを表示することなく、おそらく望ましい「オフィスに任意の数のスタッフを追加する」機能を取得します。
  • 代わりにモデル フォームセットを使用してください (収集している情報が Django モデルによって支えられていると仮定して)。そのため、フィールド名や型を明示的に指定する必要はありません。

お役に立てれば。

于 2012-05-30T15:52:09.297 に答える