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)
您当前有一个从 Contract
到 Party
的 ForeignKey
关系,这意味着您只能为每个 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='+'
完全禁用它。
我想在管理面板的字段集中使用派对模型两次(但使用不同的值),但不知道该怎么做。有办法吗?感谢您的帮助!
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)
您当前有一个从 Contract
到 Party
的 ForeignKey
关系,这意味着您只能为每个 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='+'
完全禁用它。