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)
答
我认为你必须覆盖用户模型的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之后,这样做会更容易,因为我们将对用户模型有更多的控制。
请发布代码,而不是链接到代码。 – Rebs