Измените Django ModelChoiceField, чтобы показывать полные имена пользователей, а не имена пользователей - PullRequest
32 голосов
/ 02 июля 2010

У меня есть форма в моем приложении Django (не для администратора), которая позволяет сотрудникам выбирать пользователя из раскрывающегося списка.

forms.ModelChoiceField(queryset = User.objects.filter(is_staff=False), required = False)

Проблема состоит в том, что раскрывающийся список показывает пользователей по именам пользователей, тогда как яЯ предпочитаю показывать их полное имя из user.get_full_name () и использовать имя пользователя, только если оно недоступно.Мне действительно нужно это изменение на этой странице, в других местах, таких как admin, мне все равно, использует ли оно имя пользователя.

Есть ли способ, которым я могу это сделать?

Спасибо!

Ответы [ 3 ]

62 голосов
/ 02 июля 2010

Вы можете настроить пользовательский ModelChoiceField, который будет возвращать любую метку, которую вы хотите.

Поместите что-то подобное в fields.py или где это применимо.

class UserModelChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
         return obj.get_full_name()

Тогдапри создании формы просто используйте это поле

 UserModelChoiceField(queryset=User.objects.filter(is_staff=False), required = False)

Более подробную информацию можно найти здесь

19 голосов
/ 05 апреля 2013

При работе с ModelForm я нашел следующее наиболее полезным, чтобы мне не пришлось переопределять мой набор запросов - в частности, потому что я использовал limit_choices_to в определении модели:

class MyModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(MyModelForm, self).__init__(*args, **kwargs)
        self.fields['user'].label_from_instance = lambda obj: "%s" % obj.get_full_name()

, настроенный из этогоответ https://stackoverflow.com/a/7805824/432992

2 голосов
/ 02 июля 2010

Вы можете переопределить поле с помощью пользовательского ModelChoiceField и изменить вместо функции label_from_instance значение get_full_name.См. Документы для ModelChoiceField: http://docs.djangoproject.com/en/1.2/ref/forms/fields/#modelchoicefield

...