user12295267
user12295267

Reputation:

Django admin site change_list view customization

I have a ModelAdmin subclass for my gradeScalesSettings model:

@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

Actual result

After I click Grade Scale Settings:

enter image description here

How to connect it to my views.py? This is what I want to code in my 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})

When I tried this:

@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 

In my ModelAdmin subclass:

list_display = ('configuration_select', 'new_NumberOfGrades', 'Rounding','Precision', 'Status',)

enter image description here

Is there any way to connect it to my views.py?

Expected result

This is what I want to show in my view.html:

enter image description here

That is why I want to connect it to my views.py.

Upvotes: 4

Views: 1782

Answers (2)

Pavel Shishmarev
Pavel Shishmarev

Reputation: 1483

You can alter routing for ModelAdmin by overriding get_urls:

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

This way you can have full control of a view used for your admin page and even add additional pages (more than only changelist and edit views) as you want.

If you do not need additional default views like object edit page, you can simplify code above by replacing original urls instead of searching one needed and patching:

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

Upvotes: 0

aaron
aaron

Reputation: 43083

Override ModelAdmin.changelist_view to set 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)

Upvotes: 6

Related Questions