Django - 在字段集中使用相同的模型两次

Django - Using same model twice in a fieldset

我想在管理面板的字段集中使用派对模型两次(但使用不同的值),但不知道该怎么做。有办法吗?感谢您的帮助!

from django.contrib import admin
from mvp.models import Contract, Party
# Register your models here.

class ContractAdmin(admin.ModelAdmin):

    fieldsets = [
        (None,               {'fields': ('contract_number', 'contract_type', 'contract_startdate', 'contract_enddate','contract_renewaldate', 'contract_value', 'contract_currency', 'party')}),
    ]

    search_fields = ['contract_number', 'party__party_name']
    list_display = ('contract_number', 'contract_type', 'contract_startdate', 'contract_enddate', 'contract_renewaldate')


admin.site.register(Contract, ContractAdmin)
admin.site.register(Party)

这里是models.py

class Party(models.Model):
    party_name = models.CharField('Name', max_length=60)
    party_street = models.CharField('Street', max_length=60)
    party_city = models.CharField('City', max_length=60)
    party_zip = models.CharField('Zip/Postal Code', max_length=60)
    party_country = models.CharField('Country', max_length=60)
    party_email = models.CharField('Email', max_length=60)
    party_fax = models.CharField('Fax', max_length=60)
    party_phone = models.CharField('Phone', max_length=60)
    def __unicode__(self):
        return self.party_name
    pass

class Contract(models.Model):
    CONTRACT_TYPES = (
        ('PNS', 'Purchase and Sale'),
        ('CDA', 'Confidential Disclosure Agreement'),
        ('DIS', 'Distribution'),
        ('LIC', 'Licensing Agreement'),
        ('SOW', 'Statement of Work'),
        ('IMP', 'Implementation Agreement'),
        )
    CURRENCY_TYPES = (
        ('CAD', 'CAD'),
        ('EUR', 'EUR'),
        ('USD', 'USD'),
        )
    party = models.ForeignKey(Party)
    contract_number = models.CharField('Contract Number', db_index=True,     max_length=60, primary_key=True)
    contract_type = models.CharField('Contract Type', db_index=True, max_length=3, choices=CONTRACT_TYPES)
    contract_startdate = models.DateField('Start Date')
    contract_enddate = models.DateField('End Date')
    contract_renewaldate = models.DateField('Renewal Date')
    contract_value = models.IntegerField('Value')
    contract_currency= models.CharField('Currency', db_index=True, max_length=3, choices=CURRENCY_TYPES)
    def __unicode__(self):
        return self.contract_type

为聚会创建客栈模式

from django.contrib import admin

    class PartyAdmin(admin.ModelAdmin):
         list_display = ('party_name',)

    class PartyInline(admin.TabularInline):
        model = Party

    class ContracAdmin(admin.ModelAdmin):
    fieldsets = [
            (None,               {'fields': ('contract_number', 'contract_type', 'contract_startdate', 'contract_enddate','contract_renewaldate', 'contract_value', 'contract_currency')}),
        ]

        search_fields = ['contract_number', 'party__party_name']
        list_display = ('contract_number', 'contract_type', 'contract_startdate', 'contract_enddate', 'contract_renewaldate')
        inlines = [
            PartyInline,
        ]


admin.site.register(Contract, ContractAdmin)
admin.site.register(Party, PartyAdmin)

您当前有一个从 ContractPartyForeignKey 关系,这意味着您只能为每个 Contract 选择一个 Party。这称为'one-to-many relationship'。您应该做的是将其更改为 'many-to-many' 关系。

换行:

party = models.ForeignKey(Party)

party = models.ManyToManyField(Party)

然后您可以在您的 ModelAdmin 中使用 filter_vertical 或 filter_horizontal 到 add/remove 方:

class ContractAdmin(admin.ModelAdmin):
    ....
    filter_horizontal = ('party',)

更新:如果您只需要将 2 方与合同相关联,您可以通过添加

简单地添加第二个字段
party2 = models.ForeignKey(Party, related_name='contract2')

但在这种情况下,您将无法访问 Django ORM 的优点,例如通过简单地编写 party.contracts 来获取与一方相关的所有合同。如果你永远不需要反向遍历;您可以使用 related_name='+' 完全禁用它。