我有一个默认值可调用其中一个模型字段。我正在使用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)
答案 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]