Cercherò di semplificarlo il più possibile. Diciamo che ho il seguente:Ereditarietà modello Django con inclusione_tags personalizzati
models.py
class Person(models.Model):
name = models.CharField(max_length=255)
def getRealPerson(self):
# is there a better way to do this?
ret = None
try:
ret = self.worker
except:
try:
ret = self.retired
except:
ret = self
return ret
class Worker(Person):
salary = models.IntegerField(default=0)
class Retired(Person):
age = models.IntegerField()
L'esempio non ha molta importanza per quello che voglio, basta andare con me qui. Lo scopo di questo è che posso avere una tabella principale di riferimento per tutte le persone.
Idealmente, desidero essere in grado di richiamare una vista di Person e di elencare i dettagli specifici in modo personalizzato per ciascun tipo di classe. Mi piacerebbe utilizzare un tag di inclusione personalizzato per farlo.
people.html
{% load people_extras %}
{% for person in people %}
{% show_person person %}
{% endfor %}
people_extras.py - templatetags
from django import template
@register.inclusion_tag('worker.html')
def show_worker(person):
return {'person':person}
@register.inclusion_tag('worker.html')
def show_retired(person):
return {'person':person}
#How do I write this function and use it as the show_person person tag?
from project.app.models import Worker, Retired
def show_person(person):
person = person.getRealPerson():
if isinstance(person, Worker):
return show_worker # yes, this doesn't work.
non ho idea di come farlo chiamare il modello corretto in base al tipo persona.
non riuscivo a capire come ottenere questo risultato con il modello utilizzando {% IfEqual%} come questo:
{% ifequal person.getRealPerson.__class__.__name__ "Worker" %}
{% show_worker %}
...
sono andato il percorso che ho scritto sopra con i templatetags. Tuttavia, non so dove mettere la logica per determinare il tipo di persona!
Penso che alla fine mi piacerebbe essere in grado di utilizzare una vista generica anche per questo sull'oggetto Person.
Se c'è un modo migliore per farlo, sono aperto ai suggerimenti, voglio solo farlo funzionare.
Sono stato bloccato qui per più di un giorno ... potrebbe davvero usare una spinta.
I Sono un po 'confuso sull'implementazione del tag template personalizzato di questo. testperson.cast() restituisce l'oggetto secondario corretto, ma come posso utilizzarlo chiamando il parametro inclusion_tag corretto. Il modo in cui lo ho impostato sopra, show_person non ha modo di essere chiamato (non è registrato). – lostincode
Ecco cosa ho affrontato nel secondo paragrafo. Modificato per, si spera, renderlo più chiaro. –