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?
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.
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'
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',
)