Django Admin:添加超链接到相关模型

gue*_*tli 6 django django-admin

我想添加相关模型的超链接Training

django-admin-添加超链接到相关模型

最好有声明式解决方案,因为我想在多个地方使用它。

“铅笔”图标在弹出窗口中打开相关模型。那不是我想要的。我想要一个指向相关模型的简单超链接。

顺便说一句,如果您使用“raw_id_fields”,那么结果正是我正在寻找的:有一个指向此ForeignKey相应管理界面的超链接。

JPG*_*JPG 8

2023 年 1 月 4 日更新

\n

Django 4.1开始,这成为官方构建的一部分(相关 PR)。

\n
\n

相关的小部件包装器现在有一个指向 object\xe2\x80\x99s 更改表单的链接

\n
\n

结果

\n

输出

\n
\n

上一个答案

\n

名为的类RelatedFieldWidgetWrapper在 Django 管理页面上显示图标,因此您需要覆盖它。因此,创建一个自定义类,如下所示,

\n
from django.contrib.admin.widgets import RelatedFieldWidgetWrapper\n\n\nclass CustomRelatedFieldWidgetWrapper(RelatedFieldWidgetWrapper):\n    template_name = \'admin/widgets/custom_related_widget_wrapper.html\'\n\n    @classmethod\n    def create_from_root(cls, root_widget: RelatedFieldWidgetWrapper):\n        # You don\'t need this method of you are using the MonkeyPatch method\n        set_attr_fields = [\n            "widget", "rel", "admin_site", "can_add_related", "can_change_related",\n            "can_delete_related", "can_view_related"\n        ]\n        init_args = {field: getattr(root_widget, field) for field in set_attr_fields}\n        return CustomRelatedFieldWidgetWrapper(**init_args)\n\n    def get_context(self, name, value, attrs):\n        context = super().get_context(name, value, attrs)\n        rel_opts = self.rel.model._meta\n        info = (rel_opts.app_label, rel_opts.model_name)\n        context[\'list_related_url\'] = self.get_related_url(info, \'changelist\')\n        return context
Run Code Online (Sandbox Code Playgroud)\n

看,上下文变量list_related_url就是我们这里需要的相对路径。现在,创建一个 HTML 文件来呈现输出,

\n
#File: any_registered_appname/templates/admin/widgets/custom_related_widget_wrapper.html\n\n{% extends "admin/widgets/related_widget_wrapper.html" %}\n{% block links %}\n    {{ block.super }}\n    <a href="{{list_related_url}}">- Link To Related Model -</a>\n{% endblock %}\n
Run Code Online (Sandbox Code Playgroud)\n

如何连接?

\n

方法一:猴子补丁

\n
# admin.py\n\n# other imports\nfrom ..widgets import CustomRelatedFieldWidgetWrapper\nfrom django.contrib.admin import widgets\n\nwidgets.RelatedFieldWidgetWrapper = CustomRelatedFieldWidgetWrapper # monket patch\n
Run Code Online (Sandbox Code Playgroud)\n

方法 2:覆盖 ModelAdmin

\n
# admin.py\nclass AlbumAdmin(admin.ModelAdmin):\n    hyperlink_fields = ["related_field_1"]\n\n    def formfield_for_dbfield(self, db_field, request, **kwargs):\n        formfield = super().formfield_for_dbfield(db_field, request, **kwargs)\n        if db_field.name in self.hyperlink_fields:\n            formfield.widget = CustomRelatedFieldWidgetWrapper.create_from_root(\n                formfield.widget\n            )\n        return formfield
Run Code Online (Sandbox Code Playgroud)\n

结果

\n

结果截图

\n