Измените Django ModelChoiceField, чтобы показать полные имена пользователей, а не имена пользователей
У меня есть форма в моем приложении Django (не в админе), которое позволяет сотрудникам выбирать пользователя из выпадающего списка.
forms.ModelChoiceField(queryset = User.objects.filter(is_staff=False), required = False)
Проблема заключается в том, что в раскрывающемся списке отображаются пользователи по именам пользователей, тогда как я бы предпочел показать их полное имя из user.get_full_name() и использовать имя пользователя, только если оно недоступно. Мне действительно нужно это изменение на этой странице, в других местах, таких как admin, мне все равно, использует ли он имя пользователя.
Есть ли способ сделать это?
Спасибо!
Ответы
Ответ 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