Мета-программирование в Django get_foo_display, foo_set и других, как это работает? - PullRequest
0 голосов
/ 06 января 2011

У меня есть модель пользователя с профилем UserProfile.Так или иначе, мой пользователь может иметь несколько типов книг: TA, TB, TC, TD.Эти выборы определены в кортеже выборов в моей модели (стандартным способом).

Из моего шаблона я хотел бы иметь возможность вызвать

{{ user.get_profile.has_book_type_TA }} 

и вернуть True / False.

TA - это динамическая часть, которую можно переписать как:

has_book_type_ [type_name]

Как я могу написать такой метод в моей модели?

def has_book_type_(self, type_name):
    ...

Но как сделать так, чтобы он вызывался как get_profile.has_book_type_TA

1 Ответ

2 голосов
/ 06 января 2011

В методе __init__ для вашей модели, просмотрите различные типы книг и создайте свойства:

for book_type in BOOK_TYPES:
  setattr(self, 'has_book_type_%s' % book_type, self.has_book_type_(book_type))

Тогда в ваших шаблонах проверка user.get_profile.has_book_type_TA должна работать.

...