2016-02-29 117 views
3
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是在相關表中的標準字段和內嵌形式手柄它會自動。我通過覆蓋save()MyCustomInlineForm將額外的參數值保存在不同的存儲器中。在Django聯模型管理,如何預填額外的字段與值

但是,如果我編輯現有的記錄 - 匹配器的值顯示正確,但我顯然也想預載param0和param1與相應的值。我可以在哪裏聯繫到做到這一點?

回答

3

我設法自己做。我也設法簡化我定義我的自定義額外的字段的方式,無需重寫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.ModelFormis_valid()方法,並通過self.add_error()將錯誤來完成。我希望它能幫助別人。

相關問題