-1

我有一个默认值作为模型字段之一的可调用。我正在使用 ModelForm 来输出它。从我理解的文档中,只有在创建新对象时才调用可调用对象。

我不明白为什么我会为使用默认可调用文件指定的字段获取隐藏字段。我得到以下输出,

>>> form = SomeForm()
>>> print form['eventID']

<input id="id_eventID" maxlength="255" name="eventID" type="text" value="event_2c6b2259" /><input id="initial-id_eventID" name="initial-eventID" type="hidden" value="event_cee183d7" />

并且每次我打印上面的语句时,它都会给我一个不同的 eventID 值,(我有一个随机可调用的默认值..)但是据我了解,当表单的实例时,可调用应该只调用一次已经被创造了。不是吗?

更新: forms.py

class EventForm(forms.ModelForm):
    class Meta:
        model = EiEventType

模型.py

class Event(models.Model):
    eventID = models.CharField(null=True,blank=True,default=random_eventID)
    start = models.DateTimeField(null=True, default=two_min_from_now)
    signal = models.ManyToManyField(Signal,null=True)
    ...
    ...
    ...

随机函数定义如下,

def random_eventID()
    return "event_" + str(uuid.uuid4())[:5]

def two_min_from_now()
    return datetime.datetime.now() + timedelta(minutes=2)
4

1 回答 1

1

简短的回答:添加括号来调用函数而不是传递函数。 default=random_eventID()

长答案:

它看起来ModelForm将函数保存为默认值并将其用作值。正如您所观察到的,它一遍又一遍地调用该函数。当您创建模型实例Event()时,它将通过在初始化时调用一次您的函数来工作,并且每次访问它时都不会更改。

但是,当您创建一个时,EventForm我怀疑它会将函数引用存储为默认值,因为它实际上并没有创建模型实例,而只是通过导入从模型的各种属性中填充它。

您可以通过在您的函数中放置一个调试断点来注意到这种行为,并看到它在具有不同堆栈跟踪时被多次调用,而在模型类的导入期间random_eventID被调用一次。random_eventID()

def random_eventID()
    import pdb; pdb.set_trace()
    return "event_" + str(uuid.uuid4())[:5]
于 2013-10-17T23:49:52.843 回答