Voy a tratar de simplificar esto tanto como sea posible. Digamos que tengo el siguiente:Herencia de modelo de Django con inclusión de etiquetas personalizadas
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()
El ejemplo no importa realmente para lo que quiero, sólo tiene que ir conmigo aquí. El propósito de esto es que pueda tener una tabla maestra de Persona para hacer referencia a todas las personas.
Lo ideal sería poder llamar a una vista de Persona y tener cada uno de los detalles específicos enumerados de forma personalizada para cada tipo de clase. Me gustaría utilizar una etiqueta de inclusión personalizada para hacer esto.
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.
no tengo ni idea de cómo llegar a llamar la plantilla correcta en función del tipo de persona.
no podía encontrar la manera de lograr esto con el uso de la plantilla {%}% ifequal así:
{% ifequal person.getRealPerson.__class__.__name__ "Worker" %}
{% show_worker %}
...
Fui la ruta que escribí más arriba con las templatetags. Sin embargo, ¡no sé dónde poner la lógica para determinar el tipo de persona!
Creo que eventualmente me gustaría poder utilizar una vista genérica para esto también en el objeto Person.
Si hay una forma mucho mejor de hacerlo, estoy abierto a sugerencias, solo quiero que funcione.
He estado un poco atrapado aquí por más de un día ... realmente podría usar un empujón.
I Estoy un poco confundido con la implementación de la etiqueta de plantilla personalizada de esto. testperson.cast() devuelve el subobjeto correcto, pero ¿cómo puedo usarlo para llamar al include_tag correcto? La forma en que lo configuro arriba, show_person no tiene forma de ser llamado (no está registrado). – lostincode
Eso es lo que mencioné en el segundo párrafo. Editado para que sea más claro. –