Я постараюсь максимально упростить это. Допустим, у меня есть следующее:
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()
Пример не имеет значения для того, что я хочу, просто иди со мной сюда. Цель этого состоит в том, чтобы у меня была главная таблица Person для ссылки на всех людей.
В идеале я хочу иметь возможность вызывать представление Person, и каждый из них должен указывать конкретные детали для каждого типа класса. Я хотел бы использовать пользовательский тег_ключения, чтобы сделать это.
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.
Понятия не имею, как заставить его вызывать правильный шаблон на основе типа человека.
Я не мог понять, как сделать это с помощью шаблона, используя {% ifequal%}, например:
{% ifequal person.getRealPerson.__class__.__name__ "Worker" %}
{% show_worker %}
...
Я пошел по маршруту, который я написал выше, с шаблонами. Тем не менее, я не знаю, где поставить логику, чтобы определить тип человека!
Думаю, в конечном итоге я бы хотел использовать для этого общий вид и для объекта Person.
Если есть гораздо лучший способ сделать это, я открыт для предложений, я просто хочу, чтобы это заработало.
Я как бы застрял здесь больше суток ... действительно мог бы использовать толчок.