python - 在 Django 内联模型管理中,如何用值预填充额外的字段

标签 python django django-admin

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)

这基本上就是我定义内联表单的方式,因此它有两个额外的字段 - matcher 是相关表中的标准字段,内联表单会自动处理它。我通过覆盖 MyCustomInlineForm 中的 save() 将额外的参数值保存在不同的存储中。

但如果我编辑现有记录 - 匹配器值显示正确,但我显然还想用相应的值预加载 param0 和 param1。我可以在哪里连接来做到这一点?

最佳答案

我自己设法做到了。我还设法简化了定义自定义额外字段的方式,而无需覆盖 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

如果需要 - 可以通过覆盖 forms.ModelForm 类的 is_valid() 方法并通过 self.add_error() 添加错误来验证自定义参数。我希望它对某人有所帮助。

关于python - 在 Django 内联模型管理中,如何用值预填充额外的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35701930/

相关文章:

python - 在 Pandas to_sql 中指定模式

Python 列表理解更改初始变量

python - 使用productbuild的应用程序加载器: error when creating a . pkg文件

python - 不改变模型数据的 Django REST Framework

python - 如何使用 Django 从 Azure AD 检索员工 ID?

django - 需要 "starting point"提示将 "tabbed"接口(interface)添加到 Django admin

django - 使用 django 1.4 执行 syncdb 时出现 "settings.DATABASES is improperly configured"错误

python - 如何在不使用 numpy 的情况下将 2D 列表展平为 1D?

django - 尝试运行 yarn run build-assets 时出现 Webpack 错误

python - 如何将Django模板中的{{fieldset.fields}}转换为字符串?