Lien dans django admin vers l'objet clé étranger

j'ai un modèle A avec une clé étrangère à un modèle B. Dans Django admin, Comment puis-je ajouter un lien dans la page admin du model A à côté du champ ForeignKey qui ouvre la page admin du model B ?

17
demandé sur Laurent 2015-03-03 16:21:06

2 réponses

Vous pouvez effectuer les opérations suivantes:

models.py (exemple):

model B(models.Model):
    name = models.CharField(max_length=20)

model A(models.Model):
    field1 = models.CharField(max_length=20)
    Bkey = models.ForeignKey(B)

admin.py

from django.core import urlresolvers

class AAdmin(admin.ModelAdmin):
    list_display = ["field1","link_to_B"]
    def link_to_B(self, obj):
        link=urlresolvers.reverse("admin:yourapp_b_change", args=[obj.B.id]) #model name has to be lowercase
        return u'<a href="%s">%s</a>' % (link,obj.B.name)
    link_to_B.allow_tags=True

remplacer yourrapp par le nom de votre application.

27
répondu ger.s.brett 2016-06-05 05:49:07

en plus de la réponse acceptée, dans les nouvelles versions de Django (1.10, 1.11 et 2.0), le inverse méthode est maintenant dans le paquet django.url(cf. ce lien).

de plus, vous devez utiliser le format_html méthode de sortie HTML dans l'admin. Si le allow_tags devenir inutile.

Enfin, pour ajouter un lien vers la page d'édition d'un utilisateur, j'ai cette fonction dans admin.py:

from django.urls import reverse
from django.utils.html import format_html


class ObjectAdmin(admin.ModelAdmin):
    list_display = ('name', 'link_to_user')

    def link_to_user(self, obj):
        link = reverse("admin:auth_user_change", args=[obj.user.id])
        return format_html('<a href="{}">Edit {}</a>', link, obj.user.username)
    link_to_user.short_description = 'Edit user'
15
répondu Benbb96 2018-03-16 14:04:31