Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 模型表单中的Django必填字段_Python_Django_Forms_Model_Widget - Fatal编程技术网

Python 模型表单中的Django必填字段

Python 模型表单中的Django必填字段,python,django,forms,model,widget,Python,Django,Forms,Model,Widget,我有一个表单,当我不需要它们的时候,一些字段会根据需要显示出来。这是models.py的表单 class CircuitForm(ModelForm): class Meta: model = Circuit exclude = ('lastPaged',) def __init__(self, *args, **kwargs): super(CircuitForm, self).__init__(*args, **kwargs)

我有一个表单,当我不需要它们的时候,一些字段会根据需要显示出来。这是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)
class MyForm(RequiredFieldsMixin, ModelForm):

    class Meta:
        model = MyModel
        fields = ['field1', 'field2']
        fields_required = ['field1']
此处是我的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})
我该怎么做才能不需要这两个字段

如果模型字段为blank=True,则表单字段上的required设置为False。否则,required=True

这里这么说:

看起来你做的一切都对。
您可以检查
self.fields['end']的值。必填项

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

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

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

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

这不是一个答案,但对于通过谷歌找到它的任何人来说,还有一点数据:这发生在我身上的是一个带有日期字段的模型表单。它将required设置为False,模型有“null=True,blank=True”,如果我在clean()方法中查看,表单中的字段显示required=False,但它仍然说我需要一个有效的日期格式。我没有使用任何特殊的小部件,即使在表单字段上显式设置输入格式=['%Y-%m-%d','%m/%d/%Y','%m/%d/%Y','',我也会收到“输入有效日期”消息


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

这是使用小部件时出现的错误:

解决方法:


或者票证12303展开DataGreed的回答,我创建了一个Mixin,允许您在
类上指定所需的
字段
变量,如下所示:

begin = models.DateTimeField('Start Time', null=True, blank=True)
end = models.DateTimeField('Stop Time', null=True, blank=True)
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',)

这使得
begin
end
变为
required=False

这些字段不可能通过更改小部件变成必需的。如果模型具有(null=True,blank=True),则模型表单将按required=False呈现它。看起来您是对的。字段本身不是必需的,但小部件中的日期和时间字段是必需的。如果此mixin的用户也将覆盖
\uuuuu init\uuuu
,会发生什么?混音器还能用吗?多重继承将如何解决?@user3599803当您重写
\uuuu init\uuuu
时,您应该始终调用
super()
,就像在我的代码片段中所做的那样。因此,如果我理解-我创建了一个表单和子类MyForm。我从init()调用super,它将调用mixin init,但是当调用djangl form init时?是的,还有其他资源在讨论这个问题,如果您愿意,您也可以创建一个新问题,请在这里保留关于这个特定问题主题的注释。请注意一些字段(例如
BooleanField
)将blank=True硬编码到其构造函数()中。因此,设置blank=False将自动失败。您必须在表单的构造函数中使用
self.fields[…].required=True
,以强制这些字段执行必需的行为。另见。