【问题标题】:Load data into ModelForm fields in edit mode before it rendered在渲染之前以编辑模式将数据加载到 ModelForm 字段中
【发布时间】:2015-05-04 20:31:56
【问题描述】:

我在 ModelForm 中有一个字段在模型中不存在。该字段通过覆盖 ModelForm.save() 函数单独保存:

class MyForm(ModelForm):
    custom_field = CharField(label='Custom field', widget=TextInput())
    def save(self, commit=True):
        data = self.cleaned_data
        # save custom_field

现在如何在渲染之前将此自定义字段加载到 ModelForm(在编辑模式下)。我尝试设置字段字典,但 ModelForm 中不存在字段字典:

def __init__(self, *args, **kwargs):
    super(MyForm, self).__init__(*args, **kwargs)
    self.fields['custom_field'] = self.instance._meta.model.custom_field

我收到以下错误:

type object 'MyForm' has no attribute 'fields'

【问题讨论】:

  • 你能显示你的表单域吗?

标签: django modelform


【解决方案1】:

要为字段提供初始数据,请使用initial 参数:

form = MyForm(instance=my_obj, initial={'custom_field': 'Test'})

或者,如果您想在 __init__ 构造函数中执行此操作:

def __init__(self, *args, **kwargs):
    kwargs['initial'] = kwargs.get('initial', {})
    kwargs['initial']['custom_field'] = 'Test'
    super(MyForm, self).__init__(*args, **kwargs)

【讨论】:

  • 谢谢@catavaran。这不起作用,因为“初始”键仅在表单处于 INSERT 模式时使用。当表单处于 EDIT 模式时,初始键不存在。
  • 它在编辑模式下完美运行。只需将 initialinstance 参数一起传递即可。请参阅我的答案中的更新示例。
  • 你是对的@catavaran。它似乎有效。您知道如何访问当前编辑表单的模型吗?
  • 可以从实例的_meta属性中获取模型:form.instance._meta.model
  • instance的问题是在调用super之前无法访问。有什么解决办法吗?
猜你喜欢
  • 1970-01-01
  • 2019-05-28
  • 2018-02-08
  • 1970-01-01
  • 2016-10-20
  • 2020-02-10
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
相关资源
最近更新 更多