2010-02-22 4 views
0

Я использую родовые типы в моей Profile модели:Django: проверьте шаблон в шаблоне?

user_type = models.ForeignKey(ContentType) 
object_id = models.PositiveIntegerField() 
details = generic.GenericForeignKey('user_type', 'object_id') 

Но теперь я хочу, чтобы проверить, является ли пользователь определенного типа внутри моего шаблона. Я могу получить тип пользователя с {{ user.get_profile.user_type }}, но что тогда? Или как бы добавить метод к модели, например is_type_xxx, чтобы я мог использовать его в шаблоне?

ответ

2

Возможно, я не совсем понимаю вопрос, но, похоже, вы можете просто определить функцию в своей модели, которая возвращает true, если тип является тем, что вам нужно, тогда вы можете вызвать эту функцию из шаблона так же, как вы если вы обращались к переменной.

В модели ...

user_type = models.ForeignKey(ContentType) 
object_id = models.PositiveIntegerField() 
details = generic.GenericForeignKey('user_type', 'object_id') 

def IsTypeX(): 
    return user_type == x 

В шаблоне ...

{% if user.get_profile.IsTypeX %} 
{% endif %} 
+0

Более точно 'return self.user_type == ContentType.objects.get_for_model (type)', но вы правы. – mpen

1

user_type - ForeignKey - ContentType model, поэтому относитесь к нему так, как если бы вы имели какое-либо отношение.

1

Хотя Игнасио в основном правильный, я нахожу, что может быть действительно тенденция получать много непреднамеренных удалений БД, если вы не будете осторожны. Поскольку число ContentTypes имеет тенденцию быть маленьким и относительно неизменным, я кэширую идентификатор пар имя/идентификатор, чтобы избежать его. Вы можете использовать сигнал, чтобы обновить свой dict при невозможности создания нового ContentType.

После этого вы можете автоматически создать необходимые функции is_type_xxx()/методы. Это немного klunky, но код не очень сложный.

+0

Supposedly рамки уже кэширует типы контента, чтобы свести к минимуму хиты дБ. – mpen

+0

Да, предположительно. Вы запустили статистику запросов БД и проверили? И поскольку вы не можете передавать args в «языке» шаблона Django, вам все равно нужно создать (вручную или автоматически) все необходимые методы 'is_type_xxx()', что ORM будет * not * делать для вас. У нас есть одно приложение, в котором есть более 150 ContentTypes (с добавлением большего количества на лету), поэтому намного дешевле сделать один выбор из всего беспорядка и построить методы тестирования dict и type. –

Смежные вопросы