gue*_*tli 6 django django-admin
我想添加相关模型的超链接Training
最好有声明式解决方案,因为我想在多个地方使用它。
“铅笔”图标在弹出窗口中打开相关模型。那不是我想要的。我想要一个指向相关模型的简单超链接。
顺便说一句,如果您使用“raw_id_fields”,那么结果正是我正在寻找的:有一个指向此ForeignKey相应管理界面的超链接。
从Django 4.1开始,这成为官方构建的一部分(相关 PR)。
\n\n\n相关的小部件包装器现在有一个指向 object\xe2\x80\x99s 更改表单的链接
\n
结果
\n\n名为的类RelatedFieldWidgetWrapper在 Django 管理页面上显示图标,因此您需要覆盖它。因此,创建一个自定义类,如下所示,
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 contextRun Code Online (Sandbox Code Playgroud)\n看,上下文变量list_related_url就是我们这里需要的相对路径。现在,创建一个 HTML 文件来呈现输出,
#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 %}\nRun Code Online (Sandbox Code Playgroud)\n# admin.py\n\n# other imports\nfrom ..widgets import CustomRelatedFieldWidgetWrapper\nfrom django.contrib.admin import widgets\n\nwidgets.RelatedFieldWidgetWrapper = CustomRelatedFieldWidgetWrapper # monket patch\nRun Code Online (Sandbox Code Playgroud)\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 formfieldRun Code Online (Sandbox Code Playgroud)\n| 归档时间: |
|
| 查看次数: |
1331 次 |
| 最近记录: |