在插入Django中的表单之前修改模型数据

时间:2014-10-03 08:46:20

标签: django forms models modelform

在将其插入表单之前,有没有办法修改从模型中获取的数据? 这是我的模特:

class SomeData(models.Model):
    Some_No = models.ForeignKey('SomeDef', on_delete=models.PROTECT)
    Some_Val = models.DecimalField(max_digits=10, decimal_places=3, verbose_name=_('Some_Val'))

这是我的表格:

@autostrip
class SomeForm(forms.ModelForm):

    class Meta:
        model = models.SomeData
        fields = ('Some_Val', 'Some_No')

    def __init__(self, *args, **kwargs):
        super(SomeForm, self).__init__(*args, **kwargs)
        self.fields['Some_No'].label = _(' ')

    def clean_some(self):
        some = None
        some_id = self.cleaned_data['some']
        some = models.SomeDef.objects.get(Some_No=some_id)

        return some

    def save(self, something, *args, **kwargs):
        orig_commit = kwargs.get('commit', True)
        kwargs['commit'] = False
        ri = super(SomeForm, self).save(*args, **kwargs)
        ri.Some_No = something

        if orig_commit:
            try:
                ri.save()
            except ValidationError as e:
                raise ValidationError

        return ri

模型内部保存的数据与我希望在表格填充数据时显示的数据略有不同。但是,我无法弄清楚如何以聪明的方式做到这一点。

3 个答案:

答案 0 :(得分:0)

使用pre_save信号。 Signals

答案 1 :(得分:0)

您可以使用__init__方法设置初始值:

def __init__(self, *args, **kwargs):
    super(SomeForm, self).__init__(*args, **kwargs)
    self.fields['Some_No'].initial = f(self.instance)

答案 2 :(得分:0)

当您将表单实例化到视图中时,可以将初始数据字典参数传递给表单。