2015-11-05 83 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 
相關問題