代码之家  ›  专栏  ›  技术社区  ›  GluePear

在Django管理中显示子级

  •  1
  • GluePear  · 技术社区  · 6 年前

    在Django 1.11,我有两个型号, Foo Bar :

    class Foo(models.Model):
        name = models.CharField()
    
    class Bar(models.Model):
        name = models.CharField()
        foo = models.ForeignKey(Foo)
    

    当我访问django管理中的foo页面时,我希望能够看到它下面的工具栏列表。所以我这样做 admin.py :

    class BarInline(admin.StackedInline):
        model = Bar
    
    @admin.register(Foo)
    class FooAdmin(admin.ModelAdmin):
        list_display = ('name')
        fields = ('name')
        inlines = [BarInline]
    

    但我真正想要的是一个到一个单独页面的可点击链接列表,在这里我可以编辑每个栏(以及一个添加按钮来添加一个新栏到这个foo)。也就是说,我不想要整个内联表单。这在姜戈是怎么可能的?

    2 回复  |  直到 6 年前
        1
  •  1
  •   GluePear    6 年前
    admin.py
    
    from django.urls import reverse
    from django.utils.html import format_html_join
    
    @admin.register(Foo)
    class FooAdmin(admin.ModelAdmin):
        list_display = ('name')
        fields = ('name', get_related, )
        readonly_fields = (get_related, )
    
        def get_related(self, instance):
            obj = instance.bar_set.all()
            return format_html_join(
                ',',
                '<a href="{}">{}</a>',
                ((
                    reverse('admin:{{ app_label }}_bar_change', args=(c.id,)), 
                    c.name
                ) for c in obj),
            )
    

    您可以创建一个可调用的 readonly field 哪一个会把颠倒的 admin url 在相关的 html code .

    这将导致如下结果:

    “您的只读字段”:Link1、Link2、Link3

        2
  •  1
  •   grouchoboy    6 年前

    您可以使所有字段在 BarInline .

    class BarInline(admin.StackedInline):
        model = Bar
        readonly_fields = ('id', 'name', 'foo')
        extra = 0
    

    对于添加功能,您可以修改内联模板,或者更容易地在中添加自定义字段。 FooAdmin ,类似于:

    class FooAdmin(admin.ModelAdmin):
        list_display = ('name')
        fields = ('name', 'custom_add_bar')
        inlines = [BarInline]
    
        def custom_add_bar(self, obj):
            add_url = reverse('admin:appname_bar_add')
            return mark_safe(f'<a href="{add_url}">Add Bar</a>')
    

    Documentation for reversing admin urls