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

问题描述:

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

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) 

一点点,但是我认为它可以帮助人们试图解决一个类似的问题:您可以创建新的模式,这样http://djangosnippets.org/snippets/1642/

+2

请发布代码,而不是链接到代码。 – Rebs

我认为你必须覆盖用户模型的Unicode方法。晚

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

(备查)

你应子类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) 
     ) 

最简单的办法是把一个models.py其中django.contrib.auth.models.User导入以下内容:

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

User.__unicode__ = user_unicode_patch 

这将覆盖User模型的__unicode__()方法与自定义函数,显示任何你想要的。

我和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之后,这样做会更容易,因为我们将对用户模型有更多的控制。