如何解决Django 内联模型表单集和内联模型表单处理初始值不同 问题解决办法
我使用 StackedInline 来填充 OneToOneField,但我想让它成为可选的,所以我设置了 min_num=0 和 extra = 0。
我还想在用户按下“➕ 添加另一个”按钮时包含默认值。
class MyForm(forms.ModelForm):
def __init__(self,*args,**kwargs):
kwargs['initial'] = {'hello': 'world'}
class MyInline(admin.StackedInline):
form = MyForm
extra = 0
min_num=0
这有效。当有人按下“➕ 添加另一个”按钮时,hello
字段将填充 world
。
我也想做一些自定义验证,所以看起来我必须使用 BaseInlineFormSet。我将初始内容移至 MyFormSet.__init__
class MyFormSet(BaseInlineFormSet):
def __init__(self,**kwargs):
super().__init__(*args,**kwargs)
if not self.forms:
return
self.forms[0].fields['hello'].initial = 'world'
def clean(self):
# My custom validation
class MyInline(admin.StackedInline):
formset = MyFormSet
extra = 0
min_num=0
但是当用户按下“➕添加另一个”按钮时不再填充初始值,只有当表单最初显示为 extra = 1
时。
我需要在 MyFormSet 中做另一件事来保留 MyForm 行为吗?
解决方法
问题
您不能尝试在表单集的 initial
中设置 __init__
属性,因为那时 self.forms[0]
甚至不存在。执行此操作的正确位置是(在您的第一个示例中),在您的 MyForm
的 init 方法中。
解决办法
您可以做的是使用MyFormSet
来实现您使用clean
的自定义验证,并使用MyForm
添加有关默认值的逻辑,然后:
from django.forms import formset_factory
class MyInline(admin.StackedInline):
form = Myform
formset = MyFormSet
extra = 0
min_num=0
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。