如何在Django表单中填写隐藏字段?
我有一个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()
这样就可以了。