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.
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.
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)
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é.
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)
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 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.