web-dev-qa-db-fra.com

Lien dans l'administrateur Django avec un objet de clé étrangère

J'ai un modèle A avec une ForeignKey à un modèle B. Dans Django, comment puis-je ajouter un lien dans la page d'administration du modèle A à côté du champ ForeignKey qui ouvre la page d'administration du modèle B?

19
Laurent

Vous pouvez faire ce qui suit:

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

Remplacez votre application par le nom de votre application.

27
ger.s.brett

En plus de la réponse acceptée, dans les versions plus récentes de Django (1.10, 1.11 et 2.0), la méthode reverse est maintenant dans le package Django.urls (cf. ce lien ).

De plus, vous devez utiliser la méthodeformat_htmlpour générer le code HTML dans l'administrateur. Ainsi, les allow_tags deviennent inutiles.

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'
16
Benbb96

Django 2.0+ et Python 3.5+:

from Django.urls import reverse
from Django.utils.html import escape

@admin.register(models.YourModel)
class YourModelAdmin(BaseModelAdmin):
    def model_str(self, obj: models.YourModel):
        link = reverse("admin:module_model_change", args=[obj.model.id])
        return mark_safe(f'<a href="{link}">{escape(obj.model.__str__())}</a>')

    model_str.short_description = 'Model'
    model_str.admin_order_field = 'model' # Make row sortable

    list_display = (
        'model_str',
    )
0
Tobias Ernst