web-dev-qa-db-ja.com

Djangoモデル形式の必須フィールド

必要ないときにいくつかのフィールドが必要に応じて表示されるフォームがあります。これはmodels.pyのフォームです

class CircuitForm(ModelForm):
    class Meta:
        model = Circuit
        exclude = ('lastPaged',)
    def __init__(self, *args, **kwargs):
        super(CircuitForm, self).__init__(*args, **kwargs)
        self.fields['begin'].widget = widgets.AdminSplitDateTime()
        self.fields['end'].widget = widgets.AdminSplitDateTime()

実際の回路モデルでは、フィールドは次のように定義されます。

begin = models.DateTimeField('Start Time', null=True, blank=True)
end = models.DateTimeField('Stop Time', null=True, blank=True)

これに関する私のviews.pyはこちらです:

def addCircuitForm(request):
    if request.method == 'POST':
        form = CircuitForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/sla/all')
    form = CircuitForm()    
    return render_to_response('sla/add.html', {'form': form})

2つのフィールドが必須ではないようにするにはどうすればよいですか?

71
Ryan

モデル内のフィールドの空白設定を変更したくない場合(管理サイトでの通常の検証が壊れます)、フォームクラスで次のことができます。

def __init__(self, *args, **kwargs):
    super(CircuitForm, self).__init__(*args, **kwargs)

    for key in self.fields:
        self.fields[key].required = False 

再定義されたコンストラクターは機能を損ないません。

111
DataGreed

モデルフィールドにblank = Trueがある場合、フォームフィールドでrequiredはFalseに設定されます。それ以外の場合、required = True

ここで言う: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/

あなたはすべてを正しくやっているように見えます。 self.fields['end'].requiredの値を確認できます。

17
stefanw

DataGreedの答えを拡張して、次のようにMetaクラスでfields_required変数を指定できるMixinを作成しました。

class MyForm(RequiredFieldsMixin, ModelForm):

    class Meta:
        model = MyModel
        fields = ['field1', 'field2']
        fields_required = ['field1']

ここにあります:

class RequiredFieldsMixin():

    def __init__(self, *args, **kwargs):

        super().__init__(*args, **kwargs)

        fields_required = getattr(self.Meta, 'fields_required', None)

        if fields_required:
            for key in self.fields:
                if key not in fields_required:
                    self.fields[key].required = False
4
gitaarik

それは答えではありませんが、Googleでこれを見つけた人にとっては、もう1つのデータがあります。これは、DateFieldを持つモデルフォームで起こっています。これはFalseに設定する必要があり、モデルには「null = True、blank = True」があり、フォームのフィールドにはclean()メソッド中に表示するとrequired = Falseが表示されますが、まだ有効な日付が必要と言われていますフォーマット。特別なウィジェットを使用していないため、input_formats = ['%Y-%m-%d'、 '%m /%d /%Y'、 'を明示的に設定しても、「有効な日付を入力してください」というメッセージが表示されます。フォームフィールドの%m /%d /%y '、' ']。

EDIT:それが他の誰かを助けるかどうかわからないが、私が抱えていた問題を解決した。フォームのフィールドにはデフォルトのテキストがあります(この場合、フィールドが終了日であることを示す「to」という単語。フィールドは「end_time」と呼ばれます)。具体的には、フォームのclean()メソッドで「to」という単語を探していました(clean_end_time()メソッドも試しましたが、呼び出されませんでした)。次に示すように、clean_data変数の値をNoneに設定します。 this Django ticket 。ただし、モデルの検証が無効な日付形式 "to"に対応していなかった(推測する)ことは重要ではなかった傍受します。

3
Tom

モデルフィールドドキュメント から、

以下に示すモデルがある場合、

class Article(models.Model):
    headline = models.CharField(
        max_length=200,
        null=True,
        blank=True,
        help_text='Use puns liberally',
    )
    content = models.TextField()

以下に示すように、フィールドを定義する際に、モデルのrequired=Trueではなく、blank=Falseに見出しのフォーム検証を変更できます。

class ArticleForm(ModelForm):
    headline = MyFormField(
        max_length=200,
        required=False,
        help_text='Use puns liberally',
    )

    class Meta:
        model = Article
        fields = ['headline', 'content']

質問に答えて、

class CircuitForm(ModelForm):
    begin = forms.DateTimeField(required=False)
    end = forms.DateTimeField(required=False)
        class Meta:
            model = Circuit
            exclude = ('lastPaged',)

これにより、beginendrequired=Falseになります

0

これは、ウィジェットを使用する場合のバグです。

回避策: Djangoカスタムフォームの時刻/日付ウィジェット)を使用

またはチケット12303

0
Samuel Adam