模型中的 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()

在实际的 Circuit 模型中,字段定义如下:

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

我的观点是:

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})

我可以做什么,以便不需要这两个字段?

85924 次浏览

如果模型字段为 black = True,则在表单字段中必需设置为 False,否则,必需设置为 True

这里写着: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/

看起来你每件事都做对了。 您可以检查 self.fields['end'].required的值。

如果不想修改模型中字段的空白设置(这样做会破坏管理站点的正常验证) ,可以在 Form 类中执行以下操作:

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


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

重新定义的构造函数不会损害任何功能。

这不是一个答案,但对于任何其他人谁发现这通过谷歌,一个更多的数据: 这是发生在我的模型表单与日期字段。它需要设置为 False,模型有“ null = True,black = True”,如果我在 clean ()方法中查看它,表单中的字段显示必需 = False,但它仍然说我需要一个有效的日期格式。我没有使用任何特殊的小部件,即使在表单字段上显式设置 input _ format = [’% Y -% m -% d’,’% m/% d/% Y’,’% m/% d/% y’,”] ,我也会收到“ Enter a validdate”消息。

编辑: 不知道这是否会帮助其他人,但我解决了我遇到的问题。我们的表单在字段中有一些默认文本(在本例中,单词“ to”表示字段是结束日期; 该字段称为“ end _ time”)。我特别在表单的 clean ()方法中查找单词“ to”(我也尝试了 clean _ end _ time ()方法,但它从未被调用) ,并按照 这张姜戈的票中的建议将 clean _ data 变量的值设置为 Nothing。然而,这些都无关紧要,因为(我猜想)模型的验证已经在无效的日期格式“ to”上吐了,没有给我机会拦截它。

这是使用小部件时的一个 bug:

解决办法: 以自定义形式使用 Django time/date 小部件

或12303号票

在 DataGreed 的答案的基础上,我创建了一个 Mixin,它允许您在 Meta类上指定一个 fields_required变量,如下所示:

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

模型现场文件,

如果您有如下所示的模型,

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