我有一个带有必需隐藏字段的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
它有效,但它似乎不是最好的方式。
答案 0 :(得分:0)
你可以这样做,或者你可以:
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()
这应该可以解决问题。