在django admin中保存相关模型的最佳方法是什么?

时间:2017-05-19 06:52:58

标签: python django django-admin

我有一个名为Company的模型:

class Company(TimeStampedModel):
     company_id = models.CharField(max_length=20, unique=True)
     legal_name = models.CharField(max_length=200)
     trading_name = models.CharField(max_length=200, unique=True)

     # address
     address = models.CharField(max_length=200, null=True, blank=True)
     city = models.CharField(max_length=200, null=True, blank=True)
     state = models.CharField(max_length=200, null=True, blank=True)
     zipcode = models.CharField(max_length=200, null=True, blank=True)

     # contact details
     email = models.EmailField(max_length=200, null=True, blank=True)
     phone = models.CharField(max_length=200, null=True, blank=True)

其他模型是CompanyAttributes:

class CompanyAttributes(TimeStampedModel):
""" All attributes of company"""

    corporate = models.ForeignKey(Company)
    key = models.CharField(max_length=100)
    value = models.TextField(max_length=100)

对于特定公司,我可以拥有许多属性,如帐单邮寄地址,CIN,GSTIN,帐号 我通过将所有字段定义为表单字段来显示单个表单中的所有字段,现在我想一次性保存所有字段。一种方法是覆盖ModelAdmin的save_model并逐个保存每个属性。 有没有办法使用save_related或其他方法,以便我可以一次性保存。

我的模特

class CompanyModelForm(ModelForm):
    pan_number = CharField()
    cin_number = CharField()
    gstin_number = CharField()
    account_number = CharField()

    def __init__(self, *args, **kwargs):
        super(CorporateModelForm, self).__init__(*args, **kwargs)
        self.fields['zipcode'].required = True
        self.fields['email'].required = True
        self.fields['phone'].required = True
        self.fields['cin_number'].required = True
        self.fields['gstin_number'].required = True

        obj = kwargs.get('instance')
        if obj:
           self.fields['email'].widget.attrs['disabled'] = 'disabled' 

class CompanyAdmin(admin.ModelAdmin):
    form = CompanyModelForm
    search_fields = ['company_id', 'legal_name', 'trading_name', 'address','city', 'state', 'zipcode', 'email', 'phone']
    list_display = ['id', 'legal_name', 'trading_name', 'address', 'city', 'state', 'zipcode', 'email', 'phone']
    readonly_fields = []

1 个答案:

答案 0 :(得分:1)

查看InlineModelAdmin objects

这将为你做。

class CompanyAttributesInline(admin.StackedInline):
    model = CompanyAttributes

class CompanyAdmin(admin.ModelAdmin):
    ...
    inlines = (CompanyAttributesInline,)