如何填充Django表单中的隐藏字段?

时间:2014-07-30 21:51:42

标签: python django

我有一个带有必需隐藏字段的Django ModelForm(必需表示模型中的相应字段为null = True且空白= True)。我应该在何处以及如何填写此字段(在用户提交表单后)以便可以保存此表单?我的第一个想法是在表单中篡改clean()并执行以下操作:

def clean(self):
    cleaned_data = super(SomeForm, self).clean()
    cleaned_data['hidden_field'] = value_i_want_to_be_here
    del self._errors['hidden_field']
    return cleaned_data

它有效,但它似乎不是最好的方式。

2 个答案:

答案 0 :(得分:0)

你可以这样做,或者你可以:

  • 在ModelForm中覆盖save - >直接在模型中改变那里的字段。这样,您不应该在modelform中包含该字段 - >使用指定此类排除的excludes =属性。
  • 覆盖模型类中的save,或者更好,更独立,使用pre_save信号来修改值。您还需要在表单中排除该字段。

覆盖模型形式save

def save(self, commit=True):
    instance = super(YourModelFormClass, self).save(False)
    instance.your_hidden_field = a_value
    if commit:
        instance.save()
    return instance

请记住,这是您必须在自定义模型表单类中编写的方法。

覆盖模型save

def save(self, *a, **kwa):
    self.your_hidden_field = a_value
    super(YourModelClass, self).save(*a, **kwa)

使用信号:

from django.core.signals import pre_save
from django.dispatch import receiver

@receiver(pre_save, sender=YourModelClass)
def your_custom_signal_handler(sender, **kwargs):
    instance = kwargs['instance']
    instance.your_hidden_field = a_value

如果必须在模型类中考虑更改,通常建议使用第三个。另一方面,如果改变形式,你可以做你正在做的事情或使用我给你的第一个替代方案。

答案 1 :(得分:0)

如果我正确理解了您的问题,您可以通过创建form.save()的实例来解决此问题,然后将您想要的值放在新创建的实例的指定字段中。最后保存实例。示例如下:

def form(request): if form.is_valid(): instance = form.save() instance.your_hidden_field = value_i_want_to_be_here instance.save()

这应该可以解决问题。