Django中的元编程:get_foo_display、foo_set等是如何工作的?
我有一个用户模型,里面有一个用户资料叫做 UserProfile。这个用户可以有几种类型的书籍:TA、TB、TC、TD。这些选择是在我的模型里用一个选择元组定义的(这是标准做法)。
在我的模板中,我想调用
{{ user.get_profile.has_book_type_TA }}
并返回真或假。
TA 是一个动态部分,它可以被改写成:
has_book_type_[type_name]
我该如何在我的模型中写这样的方法呢?
def has_book_type_(self, type_name):
...
但我该如何让它可以像 get_profile.has_book_type_TA 这样调用呢?
1 个回答
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
应该就能正常工作了。