/ / Django - Utilizzo dello stesso modello due volte in un fieldset: django, django-models

Django - Utilizzo dello stesso modello due volte in un fieldset - django, django-models

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 № 1

Al 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)