Django中的元编程get_foo_display,foo_set等,它是如何工作的?

时间:2011-01-06 14:59:46

标签: python django metaprogramming

我有一个带有配置文件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 个答案:

答案 0 :(得分:2)

在模型的__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应该有效。