Vorrei utilizzare il modello Party due volte (ma con valori diversi) in un fieldset nel pannello di amministrazione, ma non riesco a capire come farlo. C'è un modo? Qualsiasi aiuto è apprezzato!
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)
Ed ecco 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
risposte:
0 per risposta № 1Al momento hai un file ForeignKey
relazione da Contract
a Party
, il che significa che puoi sceglierne solo uno Party
per Contract
. Questa è chiamata "relazione uno-a-molti". Quello che dovresti fare è cambiarlo in una relazione "molti-a-molti".
Cambia la linea:
party = models.ForeignKey(Party)
a
party = models.ManyToManyField(Party)
Quindi puoi utilizzare filter_vertical o filter_horizontal nel tuo ModelAdmin per aggiungere / rimuovere Party:
class ContractAdmin(admin.ModelAdmin):
....
filter_horizontal = ("party",)
Aggiornare: Se avrai bisogno solo di 2 parti da associare a un contratto, puoi semplicemente aggiungere un secondo campo aggiungendo
party2 = models.ForeignKey(Party, related_name="contract2")
ma in questo caso non avrai accesso alle chicche di Django ORM come ottenere tutti i contratti relativi a una festa semplicemente scrivendo party.contracts
. Se non avrai mai bisogno della traversata inversa; Puoi usare related_name="+"
per disabilitarlo del tutto.
-1 per risposta № 2
Crea un modello innline per la festa
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)