2015-11-05 87 views
0

我想生成一个“更新formset”来一次更新大量实例,其中更新的字段在数据库中为空(在呈现时更新formset),但使用已填写的字段“建议”。使用modelformset_factory预填单个formset表单中的数据

我的模型放在这里:

class Event(models.Model): 
    plan_start_time = models.TimeField() 
    actual_start_time = models.TimeField(blank=True, null=True) 

所以我想在这里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__()表单域? 如果不是,这个问题的解决方法是什么?

作为一种替代方法,我正在研究将plan_start_time作为隐藏字段,然后使用Javascript将其复制到表格中每个字段的actual_start_time字段。但是如果没有Django客户端方法来做到这一点,我会感到惊讶,所以现在想避免JS。

使用Django 1.8。

+0

http://stackoverflow.com/questions/1897756/different-initial-data-for-each-form-in-a-django-formset –

+0

谢谢@ShangWang,我看过那篇文章,但似乎没有涵盖我的用例。我想要预先填充依赖于另一个字段的数据。此外,我想知道为什么上述不起作用。 – SaeX

回答

0

这可以通过提供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 
相关问题