Django中的元编程:get_foo_display、foo_set等是如何工作的?

0 投票
1 回答
534 浏览
提问于 2025-04-16 09:30

我有一个用户模型,里面有一个用户资料叫做 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 应该就能正常工作了。

撰写回答