在 Django Admin 中,添加模型作为选项卡

问题描述 投票:0回答:1

我正在尝试为我的 django 应用程序整理我的管理网站。我有一张

lorcana_sets
桌子和一张
lorcana_sets_cards
桌子。
lorcana_sets_cards
通过
lorcana_sets
字段具有指向
set_id
的外键。

如果我添加以下内容:

# Lorcana Sets - Cards
class LorcanaSetsCards(admin.ModelAdmin):
    list_display = ['name']
    list_display_links = ['name']

admin.site.register(lorcana_sets_cards, LorcanaSetsCards)

我得到一个列出所有卡片的表格,我可以单击列表中卡片的名称,然后转到卡片对象,我可以在其中编辑该卡片对象的字段。

现在我创建了以下内容,其中有集合表,当我单击集合对象时,会出现一个 Lorcana Cards 选项卡,其中包含一个表格,其中列出了该集合中的所有卡片。

class LorcanaSetsCardsInline(admin.TabularInline):
    model = lorcana_sets_cards
    extra = 0
    fields = ['id', 'number', 'full_name', 'hidden', 'manual']
    readonly_fields = ['id', 'number', 'full_name']

    @admin.display(description='Name')
    def full_name(self, obj):
        return f"{obj.name} - {obj.subtitle}" if obj.subtitle else obj.name

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        qs = qs.annotate(number_as_int=Cast('number', output_field=IntegerField())).order_by('number_as_int')
        return qs

# Lorcana Sets
class LorcanaSets(admin.ModelAdmin):
    list_display = ['code', 'name', 'type', 'release_date']
    list_display_links = ['name']
    search_fields = ['code', 'name', 'type']
    ordering = ['-release_date']

    inlines = [LorcanaSetsCardsInline,]

admin.site.register(lorcana_sets, LorcanaSets)

我希望此表有一个类似于

class LorcanaSetsCards(admin.ModelAdmin):
的链接,我可以单击该链接并转到该卡片对象以编辑我需要的任何字段。

我不确定这是否可能。我目前正在使用

Django==4.2.11

python-3.x django django-models django-admin
1个回答
0
投票

所以我设法解决了。我有 Lorcana Set 管理模型:

# Lorcana Sets
class LorcanaSets(admin.ModelAdmin):
    list_display = ['code', 'name', 'type', 'release_date']
    list_display_links = ['name']
    search_fields = ['code', 'name', 'type']
    ordering = ['-release_date']

    inlines = [LorcanaSetsCardsInline,]

admin.site.register(lorcana_sets, LorcanaSets)

我创建了 Lorcana 卡管理模型,但是我已将其从侧面导航栏中删除,因此用户必须转到集合,然后转到 Lorcana 卡选项卡。我还更改了“保存”功能,以便用户在单击时返回到 Lorcana Set 对象上的 Lorcana Card 选项卡:

# Lorcana Sets - Cards
class LorcanaSetsCardsAdmin(admin.ModelAdmin):
    # This removes it from the side navigation bar
    def has_module_permission(self, request):
        return False

    # This changes the "save" functionality to go to the Lorcana Sets object the user was previously on.
    def response_change(self, request, obj):
        if "_continue" not in request.POST and "_addanother" not in request.POST and "_saveasnew" not in request.POST:
            set_id = getattr(obj, 'set_id', None)  
            return HttpResponseRedirect(f'../../../lorcana_sets/{set_id}/change/#lorcana-cards-tab')
        else:
            return super().response_change(request, obj)

admin.site.register(lorcana_sets_cards, LorcanaSetsCardsAdmin)

以及内联 Lorcana 卡管理模型。这是显示 Lorcana Set 对象上的 Lorcana 卡列表:

class LorcanaSetsCardsInlineAdmin(admin.TabularInline):
    model = lorcana_sets_cards
    extra = 0
    fields = ['number', 'full_name_link', 'manual', 'hidden']
    readonly_fields = ['number', 'full_name_link']

    # Changed the cell to be a link to the Lorcana Card object
    @admin.display(description='Name')
    def full_name_link(self, obj):
        if obj.pk is not None and obj.pk != '':
            url = reverse('admin:%s_%s_change' % (obj._meta.app_label, obj._meta.model_name), args=[obj.pk])
            return format_html('<a href="{}">{}</a>', url, self.full_name(obj))
        else:
            return self.full_name(obj)

    def full_name(self, obj):
        return f"{obj.name} - {obj.subtitle}" if obj.subtitle else obj.name

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        qs = qs.annotate(number_as_int=Cast('number', output_field=IntegerField())).order_by('number_as_int')
        return qs

    full_name_link.allow_tags = True
© www.soinside.com 2019 - 2024. All rights reserved.