我有一个像这样的简单模型
class UserType( models.Model ) :
def __unicode__( self ) :
return self.name
TYPE_CHOICES = (
( 'ad', 'administrator' ),
( 'mo', 'moderator' ),
( 'vi', 'viewer' ),
( 'pm', 'property manager' ),
( 'po', 'property owner' ),
( 'vm', 'vendor manager' ),
( 've', 'vendor' ),
( 'te', 'tenant' ),
)
name = models.CharField( max_length = 2, choices = TYPE_CHOICES )
在admins.py
中,我为filter_horizontal = ( 'user_types', )
设置了UserProfile
,其ManyToManyField
到UserType
。但在UserProfile
管理页面中,M2M的水平过滤器仅显示元组的短名称:
同样在模板中,我想显示特定用户拥有的用户类型列表。所以我的模板代码看起来像这样
User type:
<ul>
{% if user_object.profile.user_types.all %}
{% for user_type in user_object.profile.user_types.all %}
<li>{{ user_type|capfirst }}</li>
{% endfor %}
{% else %}
<li>No user type</li>
{% endif %}
</ul>
在模板上,它只显示短名称。我知道通常我可以通过像{{ get_user_type_display }}
这样的东西来显示长名称,但在这种情况下,对于M2M,它不起作用。
所以我的问题是双重的:
答案 0 :(得分:1)
尝试以下方法:
class UserType( models.Model ) :
TYPE_CHOICES = (
( 'ad', 'administrator' ),
( 'mo', 'moderator' ),
( 'vi', 'viewer' ),
( 'pm', 'property manager' ),
( 'po', 'property owner' ),
( 'vm', 'vendor manager' ),
( 've', 'vendor' ),
( 'te', 'tenant' ),
)
STR_CHOICES = { key : value for (key,value) in TYPE_CHOICES }
name = models.CharField( max_length = 2, choices = TYPE_CHOICES )
def __str__(self):
return self.STR_CHOICES[self.name]
答案 1 :(得分:0)
Astevanovic 的回答对我很有帮助。我想补充一点。
如果你在 manytomanyfield 领域有一个模型......
如果您已在模板中从该区域上传了所有其他模型...
您将不再调用人类可读的名称 get_
选择 _display
。
用 name
来调用它就足够了,它是 return
。
所以现在只在模板 {{usertype}}