Как отличить унаследованные модели в шаблонах Django? - PullRequest
2 голосов
/ 12 сентября 2011

У меня есть 2 модели Django - модель A и модель B. Модель B наследуется от модели A.

class ModelA(models.Model):
    # Fields

class ModelB(ModelA):
    # More fields

Я хочу иметь возможность обрабатывать каждую модель по-разному в шаблонах, как показано:

{% if obj.is_modelA %} <-- This is where my problem lies
    Do something
{% elif obj.is_modelB %} <-- This is where my problem lies
    Do something else
{% endif %}

Я уверен, что мог бы взломать что-нибудь вместе, но мне бы очень хотелось узнать, есть ли предпочтительный способ сделать это.

Заранее большое спасибо:)

Ответы [ 2 ]

1 голос
/ 12 сентября 2011

Я бы сказал, сделайте это в своей модели, а не в качестве сравнения в шаблоне, как предлагает @zeekay. Это приводит к неприятной зависимости от внутренней детализации (если вы измените имя вашего класса, все сломается).

Я бы сделал это примерно так:

class ModelA(models.Model):
    is_such_and_such = False

class ModelB(ModelA):
    is_such_and_such = True

Это может быть сделано как свойство с isinstance или сравнением self.__class__.__name__, но я думаю, что определение настоящего логического значения - лучшая идея.

Конечным результатом является то, что в вашем шаблоне вы можете иметь:

{% if obj.is_such_and_such %}
    ...
{% else %}
    ...
{% endif %}

Я бы тоже делал это как функциональную вещь, а не как модель. Подумайте, как у вас есть is_staff на собственной модели User Джанго. Там не используются отдельные классы, но идея применима. Убедитесь, что то, что находится в шаблоне, имеет смысл для того, кто ничего не знает о реализации в серверной части.

0 голосов
/ 12 сентября 2011

Не уверен, есть ли предпочтительный способ сделать это. Я бы, вероятно, добавил название модели в качестве свойства:

@property
def model_name(self):
    return self.__class__.__name__
...