Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.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
Django 仅当模型字段为空时才将字段添加到表单_Django_Django Models_Django Forms - Fatal编程技术网

Django 仅当模型字段为空时才将字段添加到表单

Django 仅当模型字段为空时才将字段添加到表单,django,django-models,django-forms,Django,Django Models,Django Forms,我希望有一个表单,只在字段留空时填充要编辑的字段。例如: class UserEditConcert(forms.ModelForm): class Meta: model = models.Concert fields = ( 'genres', ) if not model.time: fields += ('time',) if model.age ==

我希望有一个表单,只在字段留空时填充要编辑的字段。例如:

class UserEditConcert(forms.ModelForm):
    class Meta:
        model = models.Concert
        fields = (
            'genres',
        )
        if not model.time:
            fields += ('time',)
        if model.age == "Unknown":
            fields += ('age',)

我的if语句都不起作用。我的语法是错误的还是因为其他原因不起作用

首先,事实上执行了
if
语句。但是您的
model.time
会获得模型上的字段。所以
Concert.time
Concert.time
实际上返回了一个描述列的实例(很可能是
models.DateTimeField
)。该
DateTimeField
具有真实性
True
,因此第一个
if
子句的主体不会触发。在第二种情况下,发生了几乎相同的过程
Concert.age
返回一些字段,该字段不等于字符串
“Unknown”

但是,现在我们可以通过在
\uuuu init\uuu
函数中动态添加或删除字段来解决这个问题。我认为删除字段可能更好。从那时起,我们不必添加很多过程逻辑来指定字段、小部件等

我们可以这样写:

class UserEditConcert(forms.ModelForm):

    def __init__(self, *args, **kwargs):    
        super(UserEditConcert, self).__init__(*args, **kwargs)
        if self.instance.time:
            del self.fields['time']
        if self.instance.age != "Unknown":
            del self.fields['age']

    class Meta:
        model = models.Concert
        fields = ('genres', 'time', 'age')
class UserEditConcert(forms.ModelForm):
定义初始化(self,*args,**kwargs):
super(UserEditConcert,self)。\uuuuuu初始化(*args,**kwargs)
如果self.instance.time:
del self.fields['time']
如果self.instance.age!=“未知”:
del self.fields['age']
类元:
模型=模型。音乐会
字段=(‘类型’、‘时间’、‘年龄’)

我们添加了一些测试,以指定何时从表单中删除某些字段。

它们可以正常工作,但是
model。type
是模型字段,而不是实例字段。感谢您的回复。是否可以在表单类中检查实例,或者我是否需要在视图中进行检查?谢谢,这非常有帮助。不幸的是,我仍然得到一个NameError,表明实例没有定义。这是从我的观点,所以我不知道为什么*args应该会处理好的,对吗?@Danny:对不起,忘了自己。举个例子。先生,你是个坏蛋。我非常感谢你在这方面的帮助。