【问题标题】:In django inline model admin, how to prefill extra fields with values在 django 内联模型管理中,如何用值预填充额外的字段
【发布时间】:2016-02-29 14:22:10
【问题描述】:
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。我在哪里可以联系到这样做?

【问题讨论】:

    标签: python django django-admin


    【解决方案1】:

    我自己设法做到了。我还设法简化了我定义自定义额外字段的方式,而不覆盖 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() 添加错误来完成。我希望它可以帮助某人。

    【讨论】:

      猜你喜欢
      • 2017-03-27
      • 2012-02-23
      • 2019-11-24
      • 2017-03-17
      • 1970-01-01
      • 2010-10-06
      • 2013-08-20
      • 2014-12-03
      • 2010-12-25
      相关资源
      最近更新 更多