如何在Django表单中填写隐藏字段?

2 投票
2 回答
3755 浏览
提问于 2025-04-18 15:25

我有一个Django的ModelForm,其中有一个必填的隐藏字段(必填的意思是模型中的对应字段设置为null=True和blank=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

你可以继续按照你现在的做法,也可以试试以下方法:

  • 在ModelForm中重写save方法——直接在模型里修改字段。这样的话,你就不需要在modelform中包含这个字段了——可以使用excludes =属性来指定要排除的字段。
  • 在模型类中重写save方法,或者更好的是,使用pre_save信号来修改值。你同样需要在表单中排除这个字段。

要重写modelform的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

如果我理解你的问题没错,你可以通过创建一个 form.save() 的实例来解决这个问题,然后把你想要的值放到这个新创建的实例的指定字段里。最后,再保存这个实例。下面是一个例子:

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

这样就可以了。

撰写回答