django如何在FilteredSelectMultiple中显示用户全名

时间:2011-09-22 07:05:44

标签: python django

我正在尝试使用FilteredSelectMultiple小部件来显示用户列表。目前它只显示用户名。我试图覆盖label_from_instance,如下所示,但它似乎不起作用。如何才能显示用户的全名。

class UserMultipleChoiceField(FilteredSelectMultiple):
    """
    Custom multiple select Feild with full name
    """                                                                                                                                                                 
    def label_from_instance(self, obj):
              return "%s" % (obj.get_full_name())

class TicketForm(forms.Form):
    cc_to  = forms.ModelMultipleChoiceField(queryset=User.objects.filter(is_active=True).order_by('username'), widget=UserMultipleChoiceField("CC TO", is_stacked=True)

6 个答案:

答案 0 :(得分:14)

最简单的解决方案是将以下内容放入导入django.contrib.auth.models.User models.py 中:

def user_unicode_patch(self):
    return '%s %s' % (self.first_name, self.last_name)

User.__unicode__ = user_unicode_patch

这将使用显示您想要的任何内容的自定义函数覆盖User模型的__unicode__()方法。

答案 1 :(得分:2)

有点晚了,但我认为它可能有助于人们尝试解决类似的问题:http://djangosnippets.org/snippets/1642/

答案 2 :(得分:1)

我认为您必须覆盖用户模型 unicode 方法。您可以创建新模型,如下所示:

class ExtendedUser(User): # inherits from django.contrib.auth.models.User
    def __unicode__(self):
        return '%s %s' % (self.first_name, self.last_name)

答案 3 :(得分:1)

(供将来参考)

您应该改为继承ModelMultipleChoiceField:

class UserMultipleChoiceField(forms.ModelMultipleChoiceField):
    """
    Custom multiple select Feild with full name
    """
    def label_from_instance(self, obj):
          return obj.get_full_name()


class TicketForm(forms.Form):
    cc_to  = UserMultipleChoiceField(
            queryset=User.objects.filter(is_active=True).order_by('username'),
            widget=FilteredSelectMultiple("CC TO", is_stacked=True)
        )

另一种解决方案是将用户子类化并在查询集中使用它 (如同这个问题: Django show get_full_name() instead or username in model form

class UserFullName(User):
    class Meta:
        proxy = True
        ordering = ["username"]

    def __unicode__(self):
        return self.get_full_name()

class TicketForm(forms.Form):
    cc_to  = forms.ModelMultipleChoiceField(
            queryset=UserFullName.objects.filter(is_active=True),
            widget=FilteredSelectMultiple("CC TO", is_stacked=True)
        )

答案 4 :(得分:0)

我和jnns一样,并且覆盖了_meta排序列表,按用户的全名命令用户列表。

# hack for displaying user's full name instead of username and order them by full name
def user_unicode_patch(self):
    return '%s %s' % (self.first_name, self.last_name)
User.__unicode__ = user_unicode_patch
User._meta.ordering = ['first_name', 'last_name']

我已在UserProfile模型文件中添加了此内容。 我不知道这是最好的方法,但肯定是非常容易和实用的。在Django 1.4中测试

对于Django 1.5之后,这样做会更容易,因为我们可以更好地控制用户模型。

答案 5 :(得分:0)

假设您的模型是

mongodb: {
client: 'mongodb',
connection: {
  host: Env.get('DB_HOST', 'localhost'),
  port: Env.get('DB_PORT', 27017),
  username: Env.get('DB_USER', 'admin'),
  password: Env.get('DB_PASSWORD', ''),
  database: Env.get('DB_DATABASE', 'adonis'),
  options: {
  }