繁体   English   中英

使管理中的 Django 只读外键字段呈现为链接

Making Django Readonly ForeignKey Field in Admin Render as a Link

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我在 Django 的管理员中公开了一个模型,它使用 ModelAdmin 的 readonly_fields 列表来显示“用户”字段,这是一个链接到 Django 用户模型的 ForiegnKey。 默认情况下, readonly_fields 使此字段呈现为包含用户电子邮件的简单文本(例如someuser@domain.com )。 我将如何更改它以呈现为该用户的关联管理页面的链接? (例如<a href="/admin/auth/user/123/">someuser@domain.com</a>

3 个回复

深入研究源代码,我发现你基本上可以将自己的字段定义为ModelAdmin子类中的方法,并且只需从方法中返回链接html即可将字段呈现为链接。

例如

from django.contrib import admin
from django.utils.safestring import mark_safe
from django.core import urlresolvers

class MyModelAdmin(admin.ModelAdmin):

    readonly_fields = ['user_link']

    def user_link(self, obj):
        change_url = urlresolvers.reverse('admin:auth_user_change', args=(obj.user.id,))
        return mark_safe('<a href="%s">%s</a>' % (change_url, obj.user.email))
    user_link.short_description = 'User'

Cerin的答案在我的Django 1.8项目中不起作用,因为readonly_fields不应该包含字符串'user_link',而是对定义函数的引用:

class ProfileAdmin(admin.ModelAdmin):
    # https://docs.djangoproject.com/en/1.8/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display
    def user(obj):
        change_url = reverse('admin:auth_user_change', args=(obj.user.id,))
        return mark_safe('<a href="{0}">{1}</a>'.format(change_url, obj.user.email))
    user.short_description = 'Edit linked user'
    raw_id_fields = ('user',)
    list_display = (user, 'last_name', 'first_name', 'specialization',)
    list_display_links = ('first_name', 'last_name', ,)
    readonly_fields = (user, 'user',)

请注意,user(obj)会覆盖Profile.user字段的单个模型编辑和模型列表显示。 另请注意,readonly_fields同时使用用户和'user',一个呈现链接的电子邮件,另一个用户名。

我创建了一些 mixin

# base.py
from django.urls import reverse
from django.utils.html import format_html


def base_method_factory(field_name):
    def base_method(obj):
        try:
            model = getattr(
                obj,
                field_name,
            )
            app_label = model._meta.app_label
            model_name = model._meta.model_name
        except AttributeError as e:
            return None
        return format_html(
            '<a href="{0}">{1}</a>&nbsp;',
            reverse('admin:%s_%s_change' % (app_label, model_name), args=[model.id]),
            str(model),
        )

    return base_method


class ReadonlyLinkMixin(object):
    def __init__(self, *args, **kwargs):
        self.create_linked_fields()
        super().__init__(*args, **kwargs)


    def create_linked_fields(self):
        linked_fields = filter(lambda name: name.endswith('_linked'), self.readonly_fields)
        for linked_field in linked_fields:
            setattr(
                self,
                linked_field,
                base_method_factory(linked_field.rpartition('_')[0])
            )


# models.py

class SomeModel(models.Model):
    ...
    task = models.FK(...)


# some_app_admin.py

@admin.register(SomeModel)
class SomeModelAdmin(
    ReadonlyLinkMixin,
    admin.ModelAdmin,
):
    fields = (
        ...
        'task_linked',
    )
    readonly_fields = (
        ...
        'task_linked',
    )

所以在管理页面中它看起来像链接的字符串
希望这会有所帮助!

1 Django 管理中的外键字段

用户模型中有大约 15 万个条目。 因此,当我在没有 raw_id_fields 的 django-admin 中使用它时,将所有条目加载为外键的选择菜单时会导致问题。 是否有其他方法可以轻松加载或可以搜索。 基本上我有上面定义的这些模型,并且有一个 User 模型在 ProfileRecomme ...

4 django渲染Foreignkey字段的字段

我有一个模型: 和我的表格: 在这里,我获得了Media中的media_files的下拉列表。 我是否有可能在Media中获得MediaManager的字段? 并呈现所有字段,media_file提供浏览选项? 有什么帮助吗? ...

5 在 django admin 中过滤外键字段

我有这些模型: 我想在管理中添加Company时过滤theme字段,如下所示: 我尝试了很多东西,但没有任何效果! 我怎样才能做到这一点? ...

9 Django管理面板中ForeignKey字段的默认值

我有两个Django模型:PageModel和RecordModel。 它们在django管理面板中注册。 如果在页面创建过程中未选择记录,我想自动创建RecordModel对象并将其分配给(PageModel的对象).record字段。 (Django Admin-添加页面表单)我尝试创 ...

10 在Django admin中显示User ForeignKey的字段

这是我的Django模型的非常简化的版本。 基本上问题出在Django管理员,当我想编辑或添加一个新的Lab对象时,包含User对象的下拉列表只显示User.username值,这只是我的情况下的数字。 我希望下拉列表显示User.last_name值。 我怎样才能做到这一点? ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM