[英]In django inline model admin, how to prefill extra fields with values
class MyCustomInline(admin.TabularInline):
min_num = 1
extra = 0
fields = ['matcher', 'param0', 'param1']
model = MyModel
form = MyCustomInlineForm
def get_formset(self, request, obj=None, **kwargs):
extra_fields = {
'param0': forms.CharField(label='First Param', required=False),
'param1': forms.CharField(label='Second Param', required=False)
}
kwargs['form'] = type('MyCustomInline', (MyCustomInlineForm,), extra_fields)
return super(MyCustomInline, self).get_formset(request, obj, **kwargs)
This is basically how I define my inline form so that it has two extra fields - matcher
is a standard field in the related table and the inline form handles it automatically. 这基本上是我如何定义我的内联表单,以便它有两个额外的字段 -
matcher
是相关表中的标准字段,内联表单自动处理它。 And I save the extra param values in a different storage via overriding the save()
in MyCustomInlineForm
. 我通过覆盖
MyCustomInlineForm
的save()
将额外的param值保存在不同的存储中。
But if I edit an existing record - matcher value appears correctly but I obviously also want to preload the param0 and param1 with the corresponding values. 但是如果我编辑现有记录 - 匹配器值正确显示但我显然也想用相应的值预加载param0和param1。 Where can I hook up to do that?
我可以在哪里联系呢?
I managed to do it on my own. 我设法自己做了。 I also managed to simplify the way I define my custom extra fields, without overriding
get_formset
method: 我还设法简化了我定义自定义额外字段的方式,而没有覆盖
get_formset
方法:
class MyCustomInlineForm(forms.ModelForm):
matcher = forms.ChoiceField(choices=[(v['name'], v['name']) for v in matchers], label='Matcher')
param0 = forms.CharField(label='First Param', required=False)
param1 = forms.CharField(label='Second Param', required=False)
def __init__(self, *args, **kwargs):
super(MyCustomInlineForm, self).__init__(*args, **kwargs)
if self.instance.pk:
""" self.instance is the model for the current row.
If there is a pk property that is not None, it means it's not
a new, empty inline model but we are working with existing one."""
self.initial['param0'], self.initial['param1'] = custom_way_to_load_params(self.instance)
def save(self, commit=True):
model = super(MyCustomInlineForm, self).save(True)
param0 = self.cleaned_data['param0']
param1 = self.cleaned_data['param1']
custom_way_to_save_params(model, param0, param1)
return model
class MyCustomInline(admin.TabularInline):
min_num = 1
extra = 0
fields = ['matcher', 'param0', 'param1']
model = MyModel
form = MyCustomInlineForm
If needed - validation of custom params could be done by overriding is_valid()
method of forms.ModelForm
class and adding errors via self.add_error()
. 如果需要 - 可以通过覆盖
forms.ModelForm
类的is_valid()
方法并通过self.add_error()
添加错误来完成自定义参数的验证。 I hope it helps someone. 我希望它对某人有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.