Как изменить отображаемый текст в раскрывающемся меню иностранной клавиши администратора Django - PullRequest
3 голосов
/ 18 июня 2010

У меня есть список задач, с возможностью назначения пользователей. Так что у меня есть иностранный ключ к модели пользователя в базе данных. Тем не менее, в раскрывающемся меню по умолчанию отображается имя пользователя, я хотел бы отображать полное имя (первый, последний) вместо имени пользователя. Если иностранный ключ указывает на один из моих собственных классов, я могу просто изменить функцию str в модели, но пользователь - это модель аутентификации django, поэтому я не могу легко изменить ее напрямую, верно?

У кого-нибудь есть идеи, как этого добиться?

Большое спасибо!

Ответы [ 3 ]

3 голосов
/ 21 июня 2010

Вы можете создать новую ModelForm для своей модели Task, которая будет отображать список пользователей, как вам нравится (код здесь предполагает модель с именем Task с атрибутом 'user'):

def get_user_full_name_choices:
    return [(user, user.get_full_name()) for user in User.objects.all()]

class TaskAdminForm(forms.ModelForm):
    class Meta:
        model = Task
    user = forms.ChoiceField(choices=get_user_full_name_choices)

Затем скажите вашему классу ModelAdmin использовать новую форму:

class TaskAdmin(admin.ModelAdmin):
    form = TaskAdminForm
2 голосов
/ 14 октября 2017

Есть еще один выбор:

USERS = [(user.id, user.get_full_name()) for user in User.objects.all()]
USERS.insert(0, ('', '----'))

class TaskAdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
    super(TaskAdminForm, self).__init__(*args, **kwargs)
    self.fields['user'].choices=USERS
1 голос
/ 16 мая 2019

Более общее, подробное решение, использующее ModelChoiceField в качестве базы. Избегает возиться с наборами запросов, просто сосредоточившись на изменении видимого значения в раскрывающемся списке.

  1. создайте свое собственное поле формы:
class CustomLabelChoiceField(forms.ModelChoiceField):
     def label_from_instance(self, obj):
         return "Howdy {}".format(obj.name)
  1. используйте его либо с formfield_for_dbfield (как в ссылке), либо, более подробно, в форме администратора:
class TaskAdminForm(forms.ModelForm):
    user = CustomLabelChoiceField(queryset=User.objects.all()
    class Meta:
        model = Task


# obviously, link it with your admin
class TaskAdmin(admin.ModelAdmin):
    form = TaskAdminForm
...