Django在ModelForm中为随机可调用的默认值显示隐藏的表单字段?

时间:2013-10-17 18:44:53

标签: django django-models django-forms

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

我不明白为什么我得到一个默认可调用指定字段的隐藏字段。 我得到以下输出,

>>> 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值,(我有一个随机可调用的默认值..) 但据我所知,只有在创建表单实例时才应调用一次callable。 不是吗?

更新 forms.py

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

models.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)

1 个答案:

答案 0 :(得分:1)

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

长答案:

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

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

你可以通过在你的函数中放置一个调试断点来看到这种行为,当它是random_eventID具有不同的堆栈跟踪并且在导入期间random_eventID()被调用时,它会被多次调用。模特课。

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