使用 modelformset_factory 在单个 formset 表单中预填数据
Pre-fill data in individual formset forms with modelformset_factory
我想生成一个 "update formset" 来一次性更新大量实例,其中更新的字段在数据库中为空(在呈现更新表单集时)但是 "suggested" 使用已填写的字段。
我的模型在这里:
class Event(models.Model):
plan_start_time = models.TimeField()
actual_start_time = models.TimeField(blank=True, null=True)
所以我想要的是 table,其中 actual_start_time
建议 plan_start_time
作为预填充(初始)值。
我试过的:
class EventForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(EventForm, self).__init__(*args, **kwargs)
self.fields['actual_start_time'].initial = self.fields['plan_start_time'] # doesn't work
self.fields['actual_start_time'].initial = "08:00" # doesn't work either
self.fields['actual_start_time'].initial = datetime.time(hour=8) # doesn't work...
self.initial['actual_start_time'] = self.fields['plan_start_time'] # this puts '<django.forms.fields.TimeField object at 0x067BA330>' in the field... not its value
class Meta:
model = Event
fields = ('plan_start_time', 'actual_start_time', )
# Specifying form to use
MyFormSet = modelformset_factory(Event, extra=0, fields=('plan_start_time', 'actual_start_time'), form=EventForm)
我想问题归结为:我可以访问表单 __init__()
中的表单字段 value 吗?
如果没有,这个问题的解决方法是什么?
作为替代方案,我正在考虑将 plan_start_time
呈现为隐藏字段,然后将其复制到 table 中每个字段的 actual_start_time
字段,使用 Javascript。但如果没有 Django 客户端方法来执行此操作,我会感到惊讶,所以现在想避免使用 JS。
使用 Django 1.8。
这可以通过提供 form
在 modelformset_factory
中使用并以正确的方式覆盖 __init__()
来完成。使用self.instance
,可以访问对象现有的表单值:
def __init__(self, *args, **kwargs):
super(EventForm, self).__init__(*args, **kwargs)
if not self.instance.actual_start_time:
self.initial['actual_start_time'] = self.instance.plan_start_time
我想生成一个 "update formset" 来一次性更新大量实例,其中更新的字段在数据库中为空(在呈现更新表单集时)但是 "suggested" 使用已填写的字段。
我的模型在这里:
class Event(models.Model):
plan_start_time = models.TimeField()
actual_start_time = models.TimeField(blank=True, null=True)
所以我想要的是 table,其中 actual_start_time
建议 plan_start_time
作为预填充(初始)值。
我试过的:
class EventForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(EventForm, self).__init__(*args, **kwargs)
self.fields['actual_start_time'].initial = self.fields['plan_start_time'] # doesn't work
self.fields['actual_start_time'].initial = "08:00" # doesn't work either
self.fields['actual_start_time'].initial = datetime.time(hour=8) # doesn't work...
self.initial['actual_start_time'] = self.fields['plan_start_time'] # this puts '<django.forms.fields.TimeField object at 0x067BA330>' in the field... not its value
class Meta:
model = Event
fields = ('plan_start_time', 'actual_start_time', )
# Specifying form to use
MyFormSet = modelformset_factory(Event, extra=0, fields=('plan_start_time', 'actual_start_time'), form=EventForm)
我想问题归结为:我可以访问表单 __init__()
中的表单字段 value 吗?
如果没有,这个问题的解决方法是什么?
作为替代方案,我正在考虑将 plan_start_time
呈现为隐藏字段,然后将其复制到 table 中每个字段的 actual_start_time
字段,使用 Javascript。但如果没有 Django 客户端方法来执行此操作,我会感到惊讶,所以现在想避免使用 JS。
使用 Django 1.8。
这可以通过提供 form
在 modelformset_factory
中使用并以正确的方式覆盖 __init__()
来完成。使用self.instance
,可以访问对象现有的表单值:
def __init__(self, *args, **kwargs):
super(EventForm, self).__init__(*args, **kwargs)
if not self.instance.actual_start_time:
self.initial['actual_start_time'] = self.instance.plan_start_time