必要ないときにいくつかのフィールドが必要に応じて表示されるフォームがあります。これは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つのフィールドが必須ではないようにするにはどうすればよいですか?
モデル内のフィールドの空白設定を変更したくない場合(管理サイトでの通常の検証が壊れます)、フォームクラスで次のことができます。
def __init__(self, *args, **kwargs):
super(CircuitForm, self).__init__(*args, **kwargs)
for key in self.fields:
self.fields[key].required = False
再定義されたコンストラクターは機能を損ないません。
モデルフィールドにblank = Trueがある場合、フォームフィールドでrequiredはFalseに設定されます。それ以外の場合、required = True
ここで言う: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/
あなたはすべてを正しくやっているように見えます。 self.fields['end'].required
の値を確認できます。
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
それは答えではありませんが、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"に対応していなかった(推測する)ことは重要ではなかった傍受します。
モデルフィールドドキュメント から、
以下に示すモデルがある場合、
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',)
これにより、begin
とend
がrequired=False
になります