Подтвердить что ты не робот

Измените Django ModelChoiceField, чтобы показать полные имена пользователей, а не имена пользователей

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

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

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

Есть ли способ сделать это?

Спасибо!

4b9b3361

Ответ 1

Вы можете настроить пользовательский 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)

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

Ответ 2

При работе с 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()

настроен из этого ответа fooobar.com/questions/168717/...

Ответ 3

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