Django, как отобразить полное имя пользователя в FilteredSelectMultiple - PullRequest
5 голосов
/ 22 сентября 2011

Я пытаюсь использовать виджет 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)

Ответы [ 5 ]

14 голосов
/ 04 ноября 2012

Самое простое решение - поместить следующее в 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__().с пользовательской функцией, которая отображает все, что вы хотите.

2 голосов
/ 05 февраля 2012

Немного поздно, но я думаю, что это может помочь людям, пытающимся решить подобную проблему: http://djangosnippets.org/snippets/1642/

1 голос
/ 08 июня 2012

(для дальнейшего использования)

Вместо этого следует использовать подкласс 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)
        )

Другое решение заключается в создании подкласса User и использовании его в запросе.установите ( как в этом вопросе: Django покажите get_full_name () вместо или имя пользователя в форме модели )

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)
        )
1 голос
/ 22 сентября 2011

Я думаю, вы должны переопределить модель пользователя Юникод метод.Вы можете создать новую модель, например:

class ExtendedUser(User): # inherits from django.contrib.auth.models.User
    def __unicode__(self):
        return '%s %s' % (self.first_name, self.last_name)
0 голосов
/ 12 января 2013

Я сделал то же самое, что и 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 после этого будет легче сделать это, так как у нас будет больше контроля над моделью User.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...