Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在django内联模型管理中,如何使用值预先填充额外字段_Python_Django_Django Admin - Fatal编程技术网

Python 在django内联模型管理中,如何使用值预先填充额外字段

Python 在django内联模型管理中,如何使用值预先填充额外字段,python,django,django-admin,Python,Django,Django Admin,这就是我定义内联表单的基本方式,它有两个额外的字段-matcher是相关表中的标准字段,内联表单会自动处理它。通过覆盖MyCustomInlineForm中的save(),我将额外的参数值保存在不同的存储器中 但是,如果我编辑了一个现有的记录,那么匹配器值将正确显示,但我显然也希望用相应的值预加载param0和param1。我在哪里可以联系到一起做这件事?我自己设法做到了。我还设法简化了定义自定义额外字段的方式,而没有覆盖get\u formset方法: class MyCustomInline

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


但是,如果我编辑了一个现有的记录,那么匹配器值将正确显示,但我显然也希望用相应的值预加载param0和param1。我在哪里可以联系到一起做这件事?

我自己设法做到了。我还设法简化了定义自定义额外字段的方式,而没有覆盖
get\u formset
方法:

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)
如果需要-可以通过重写
forms.ModelForm
类的
is\u valid()
方法并通过
self.add\u error()
添加错误来验证自定义参数。我希望它能帮助别人

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