我正在尝试使用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)
答案 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: {
}