Django管理站点change_list视图自定义

4

我有一个用于我的gradeScalesSettings模型的ModelAdmin子类:

@admin.register(gradeScalesSetting)
class gradeScalesSettingAdmin(admin.ModelAdmin):
    list_display = ('configuration_select', 'NumberOfGrades', 'Rounding','Precision', 'Status',)
    change_list_template = 'admin/Homepage/view.html'

enter image description here

实际结果

我点击等级比例设置之后:

enter image description here

如何将其连接到我的views.py文件? 以下是我想在我的views.py中编写的代码:
def gradescales(request):
    gradeScalesSettings = gradeScalesSetting.objects.all()
    configurations = configuration.objects.all()
    rounding = gradeScalesSetting.objects.all().values_list('Rounding', flat=True).distinct()
    print(rounding)
    return render(request, 'Homepage/gradescale.html', {"rounding": rounding,"gradeScalesSetting":gradeScalesSettings,"configurations":configurations})

当我尝试这个时:
@admin.register(gradeScalesSetting)
class gradeScalesSettingAdmin(admin.ModelAdmin):
    def new_NumberOfGrades(self, obj):
        if obj.NumberOfGrades == 'Grade Scale Settings':
            return '<a href="view.html" </a>'  # this url will redirect to your 

在我的ModelAdmin子类中:
list_display = ('configuration_select', 'new_NumberOfGrades', 'Rounding','Precision', 'Status',)

enter image description here

有没有办法将它连接到我的views.py文件?

期望的结果

这是我想在我的view.html中展示的内容:

enter image description here

那就是为什么我想将它连接到我的views.py文件中。

view.html和gradescale.html有什么区别? - aaron
2个回答

6

重写ModelAdmin.changelist_view以设置extra_context

@admin.register(gradeScalesSetting)
class gradeScalesSettingAdmin(admin.ModelAdmin):
    list_display = ('configuration_select', 'NumberOfGrades', 'Rounding','Precision', 'Status',)
    change_list_template = 'admin/Homepage/view.html'

    def changelist_view(self, request, extra_context=None):
        extra_context = extra_context or {}

        gradeScalesSettings = gradeScalesSetting.objects.all()
        configurations = configuration.objects.all()
        rounding = gradeScalesSetting.objects.all().values_list('Rounding', flat=True).distinct()

        extra_context.update({
            "rounding": rounding,
            "gradeScalesSetting": gradeScalesSettings,
            "configurations": configurations,
        })
        return super().changelist_view(request, extra_context=extra_context)

之后,我应该在哪里在相应的模板中实现新的上下文变量? - 101is5
我只是想知道这个是否足以完成任务,或者还需要自定义change_list.html才能有效地呈现自定义内容。这几乎完全符合我的问题。 - 101is5
1
自定义 change_list.html(就像 OP 对 admin/Homepage/view.html 所做的一样)是必要的。 - aaron

0

您可以通过覆盖get_urls来更改ModelAdmin的路由:

class gradeScalesSettingAdmin(admin.ModelAdmin):
    def get_urls(self):
        urls = super().get_urls()
        pat = [i for i in urls if str(i.name).endswith('changelist')][0]  # Find needed path object to replace
        index = urls.index(pat)
        urls[index] = path(pat.pattern._route, gradescales)
        return urls

这样,您可以完全控制用于管理页面的视图,并根据需要添加其他页面(不仅限于更改列表和编辑视图)。

如果您不需要额外的默认视图,例如对象编辑页面,则可以通过替换原始URL而不是搜索所需的URL并打补丁来简化上面的代码:

class gradeScalesSettingAdmin(admin.ModelAdmin):
    def get_urls(self):
        urls = [
            path('', gradescales)
        ]
        return urls

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接