54 votes

Comment modifier le texte d'affichage de la clé étrangère dans l'administration de Django ?

Comment puis-je changer le texte affiché dans un champ <sélect> tout en sélectionnant un champ qui est une ForeignKey ?

J'ai besoin d'afficher non seulement le nom de ForeignKey mais aussi le nom de son parent.

64voto

Béres Botond Points 4398

Si vous souhaitez qu'elle ne prenne effet que dans l'administration, et non de manière globale, vous pouvez alors créer un fichier personnalisé ModelChoiceField et l'utiliser dans une sous-classe personnalisée ModelForm puis paramétrez la classe d'administration concernée pour qu'elle utilise votre formulaire personnalisé. À l'aide d'un exemple qui possède une clé étrangère vers le fichier Person modèle utilisé par @Enrique :

class Invoice(models.Model):
      person = models.ForeignKey(Person)
      ....

class InvoiceAdmin(admin.ModelAdmin):
      form = MyInvoiceAdminForm

class MyInvoiceAdminForm(forms.ModelForm):
    person = CustomModelChoiceField(queryset=Person.objects.all()) 
    class Meta:
          model = Invoice

class CustomModelChoiceField(forms.ModelChoiceField):
     def label_from_instance(self, obj):
         return "%s %s" % (obj.first_name, obj.last_name)

60voto

alekwisnia Points 765

Une autre façon de procéder (utile lorsque vous modifiez votre queryset) :

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.fields['user'].queryset = User.objects.all()
        self.fields['user'].label_from_instance = lambda obj: "%s %s" % (obj.last_name, obj.first_name)

'user' est le nom du champ que vous voulez remplacer. Cette solution présente un avantage : vous pouvez également remplacer le queryset (par exemple, vous voulez que User.objects.filter(username__startswith='a') )

Disclaimer : solution trouvée sur http://markmail.org/message/t6lp7iqnpzvlt6qp et testé.

19voto

Lu.nemec Points 53

Les versions plus récentes de django prennent en charge cette fonction, qui peut être traduite avec gettext :

models.ForeignKey(ForeignStufg, verbose_name='your text')

17voto

radtek Points 506

Vous pouvez également le faire directement à partir de votre admin.ModelAdmin en utilisant label_from_instance . Par exemple :

class InvoiceAdmin(admin.ModelAdmin):

    list_display = ['person', 'id']

    def get_form(self, request, obj=None, **kwargs):
        form = super(InvoiceAdmin, self).get_form(request, obj, **kwargs)
        form.base_fields['person'].label_from_instance = lambda obj: "{} {}".format(obj.id, obj.first_name)
        return form

admin.site.register(Invoice, InvoiceAdmin)

12voto

Voir https://docs.djangoproject.com/en/1.3/ref/models/instances/#unicode

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)

    def __unicode__(self):
        return u'%s %s' % (self.first_name, self.last_name)

vous devez définir ce que vous voulez afficher dans la section unicode de votre modèle (où se trouve la clé étrangère).

Regards,

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X