/ / Django - Използване на един и същ модел два пъти в полеви набор - django, django-модели

Django - Използване на същия модел два пъти в полеви набор - django, django-модели

Бих искал да използвам модела Party два пъти (но с различни стойности) в полеви набор в панела на администратора, но не мога да разбера как да го направя. Има ли начин? Всяка помощ се оценява!

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

Отговори:

0 за отговор № 1

В момента имате ForeignKey връзка от Contract да се Party, което означава, че можете да изберете само едно Party на Contract, Това се нарича „връзка между мнозина“. Това, което трябва да направите, е да го промените на отношение „много към много“.

Промяна на реда:

party = models.ForeignKey(Party)

да се

party = models.ManyToManyField(Party)

След това можете да използвате filter_vertical или filter_horizontal във вашия ModelAdmin за добавяне / премахване на страни:

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

Актуализация: Ако ще ви трябват само 2 страни, които да бъдат свързани с договор, можете просто да добавите второ поле чрез добавяне

party2 = models.ForeignKey(Party, related_name="contract2")

но в този случай вие нямате достъп до благините на Django ORM, като например да получите всички договори, свързани със страна, като просто пишете party.contracts, Ако никога няма да се нуждаете от обратното преминаване; можеш да използваш related_name="+" за да го деактивирате напълно.


-1 за отговор № 2

Създайте вътрешен модел за парти

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)