【问题标题】:How to fill a hidden field in a Django form?如何填写 Django 表单中的隐藏字段?
【发布时间】:2014-09-22 17:34:04
【问题描述】:

我有一个带有必填隐藏字段的 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

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

【问题讨论】:

  • 确定那是正确的方法......为什么不是呢?
  • 更重要的是,为什么有一个未在客户端填写的必填隐藏字段?

标签: python django


【解决方案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()

这应该可以解决问题。

【讨论】:

    【解决方案2】:

    你可以做你正在做的事情,或者你可以:

    • 在 ModelForm 中覆盖 save -> 直接在模型中更改该字段。这样,您不应该在模型表单中包含该字段 -> 使用 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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-17
      • 2012-09-15
      • 1970-01-01
      • 2010-09-30
      • 2010-11-18
      • 2023-02-11
      • 1970-01-01
      • 2019-01-03
      相关资源
      最近更新 更多