Бих искал да използвам модела 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)