【问题标题】:Modify model data before inserting into a form in Django在 Django 中插入表单之前修改模型数据
【发布时间】:2014-11-28 07:58:28
【问题描述】:

有没有办法在将模型获得的数据插入到表单中之前对其进行修改? 这是我的模型:

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

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

【问题讨论】:

    标签: django forms models modelform


    【解决方案1】:

    使用 pre_save 信号。 Signals

    【讨论】:

    • pre_save 信号会帮助我用修改后的数据填充表单吗?我想我可能说的不够清楚:我不想修改数据本身,我想修改表单内部的数据(即表单中显示的数据)。
    • @elena 你想做什么?当你调用你的表单时,你可以用一个字典来填充它。这里 "self.fields['Some_No'].label = _(' ')" 它是某种类型的 i18n ?¿。
    【解决方案2】:

    可以在__init__方法中设置初始值:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2011-10-30
        • 1970-01-01
        • 1970-01-01
        • 2017-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-19
        相关资源
        最近更新 更多