如何在带有选项(元组)的ManyToManyField中显示全名?

时间:2012-04-09 06:45:57

标签: python django django-admin django-templates django-orm

我有一个像这样的简单模型

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,其ManyToManyFieldUserType。但在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,它不起作用。

所以我的问题是双重的:

  1. 如何在管理页面中显示M2M选择/元组的长名称?
  2. 如何在模板中的M2M选项/元组中显示长名称?

2 个答案:

答案 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}}