2

Django 1.4 フォームセットを使用しており、フォームセットの最初のフォームに対して別の検証を実行したいと考えています。

ユーザーが最大4つの場所を入力できるようにする4つのテキストフィールドを表示するLocationFormがあります。

class LocationForm(forms.Form):
    user_entered_address = forms.CharField(required=False, max_length=255)
    full_address = forms.CharField(max_length=255, required=False, widget=forms.HiddenInput())
    city = forms.CharField(max_length=255, required=False, widget=forms.HiddenInput())
    state = forms.CharField(max_length=255, required=False, widget=forms.HiddenInput())
    country = forms.CharField(max_length=255, required=False, widget=forms.HiddenInput())
    latitude = forms.CharField(required=False, widget=forms.HiddenInput())
    longitude = forms.CharField(required=False, widget=forms.HiddenInput())

LocationFormSet = formset_factory(LocationForm, extra=4, max_num=4)

これは入力フィールドを表示するのにうまく機能しますが、フォームセットの最初の LocationForm を必須にし、残りのフォームをオプションにしたいと思います (つまり、ユーザーは最初のフォームに少なくとも 1 つの場所を入力する必要がありますが、残りはオプション)。

フォームを変更すると、次のものが削除されrequired=Falseます。

    user_entered_address = forms.CharField(max_length=255)

次にuser_entered_address、すべてのフォームに必要です。カスタムの clean() メソッドを作成する必要があると感じていますが、最初のフォームを見つけて、空白かどうかを判断し、user_entered_address空白の場合は ValidationError を発生させる方法に行き詰まっています。

class BaseLocationFormSet(BaseFormSet):
    def clean(self):
        # How to do I find the first form and ensure user_entered_address isn't blank?

LocationFormSet = formset_factory(LocationForm, extra=4, max_num=4, formset=BaseLocationFormSet)

それとも、これは間違ったアプローチであり、これを行うためのより良い方法がありますか? ありがとう!

4

1 に答える 1

1

次のようなフォームにアクセスできます。

form = self.forms[0]

したがって、クリーンでは最初のフォームをチェックして、他のフォームを無視してください。

form = self.forms[0]
title = form.cleaned_data['title']
if title is None:
    raise forms.ValidationError("Missing title")
于 2012-11-06T19:57:32.667 に答える