gpt4 book ai didi

python - 在 Django 管理中将外键列显示为指向详细信息对象的链接

转载 作者:行者123 更新时间:2023-11-28 19:35:12 25 4
gpt4 key购买 nike

link-in-django-admin-to-foreign-key-object 中所述, 可以将 ForeignKey 字段显示为管理详细信息页面的链接。

总而言之,

class Foo(Model):
bar = models.ForeignKey(Bar)

class FooAdmin(ModelAdmin):
list_display = ('link_to_bar',)
def link_to_bar(self, obj):
link = urlresolvers.reverse('admin:app_bar_change', args=[obj.bar_id])
return u'<a href="%s">%s</a>' % (link, obj.bar) if obj.bar else None
link_to_bar.allow_tags = True

问题是:我们可以更自动地做到这一点吗?例如,向 FooAdmin 定义提供一个外键列表,以显示为详细页面的链接:

class FooAdmin(ModelAdmin):
...
list_foreign_key_links = ('bar',)
...

我知道这些 ModelAdmin 类是用元类编程生成的。那么,应该是可以的。这样做的良好开端是什么?

最佳答案

下面的解决方案使用 this answer但使其可由所有模型重用,避免向每个管理类添加方法的需要。

示例模型

# models.py
from django.db import models

class Country(models.Model):
name = models.CharField(max_length=200)
population = models.IntegerField()

class Career(models.Model):
name = models.CharField(max_length=200)
average_salary = models.IntegerField()

class Person(models.Model):
name = models.CharField(max_length=200)
age = models.IntegerField()
country = models.ForeignKey(Country, on_delete=models.CASCADE)
career = models.ForeignKey(Career, on_delete=models.CASCADE)

管理员示例

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

from .models import Person


def linkify(field_name):
"""
Converts a foreign key value into clickable links.

If field_name is 'parent', link text will be str(obj.parent)
Link will be admin url for the admin url for obj.parent.id:change
"""
def _linkify(obj):
linked_obj = getattr(obj, field_name)
if linked_obj is None:
return '-'
app_label = linked_obj._meta.app_label
model_name = linked_obj._meta.model_name
view_name = f'admin:{app_label}_{model_name}_change'
link_url = reverse(view_name, args=[linked_obj.pk])
return format_html('<a href="{}">{}</a>', link_url, linked_obj)

_linkify.short_description = field_name # Sets column name
return _linkify



@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
list_display = [
"name",
"age",
linkify(field_name="country"),
linkify(field_name="career"),
]

结果

给定一个名为 app 的 App,以及一个带有 country 和 carreer 外键值的 Person 实例 Person(name='Adam' age=20) 123456,列表结果将是:

| Name | Age |                          Country                          |...|
|------|-----|-----------------------------------------------------------|...|
| Adam | 20 | <a href="/admin/app/country/123">Country object(123)</a> |...|

(继续)

|...|                          Career                         |
|---|---------------------------------------------------------|
|...| <a href="/admin/app/career/456">Career object(456)</a> |

关于python - 在 Django 管理中将外键列显示为指向详细信息对象的链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37539132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com