使用modelformset_factory以单独的formset形式预填充数据

时间:2015-11-05 14:52:20

标签: django django-forms

我想生成一个"更新表格集"一次更新大量实例,其中更新的字段在数据库中是空的(在呈现更新表单集时),但是建议"使用已经填写的字段。

我的模特在这里:

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。

1 个答案:

答案 0 :(得分:0)

这可以通过在public class DecisionTree { // ... public static class Pair { // ... } } 中提供form并以正确的方式覆盖modelformset_factory来完成。使用__init__(),可以访问对象的现有表单值:

self.instance