Django 管理站点 change_list 视图自定义
Posted
技术标签:
【中文标题】Django 管理站点 change_list 视图自定义【英文标题】:Django admin site change_list view customization 【发布时间】:2020-03-04 16:22:14 【问题描述】:我的gradeScalesSettings
模型有一个ModelAdmin
子类:
@admin.register(gradeScalesSetting)
class gradeScalesSettingAdmin(admin.ModelAdmin):
list_display = ('configuration_select', 'NumberOfGrades', 'Rounding','Precision', 'Status',)
change_list_template = 'admin/Homepage/view.html'
实际结果
点击等级设置后:
如何将它连接到我的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',)
有什么方法可以将它连接到我的views.py?
预期结果
这就是我想在 view.html 中显示的内容:
这就是为什么我想将它连接到我的views.py。
【问题讨论】:
view.html 和gradescale.html 有什么区别? 【参考方案1】:您可以通过覆盖 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 来简化上面的代码,而不是搜索需要的并打补丁:
class gradeScalesSettingAdmin(admin.ModelAdmin):
def get_urls(self):
urls = [
path('', gradescales)
]
return urls
【讨论】:
【参考方案2】:覆盖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 您可以ask a new question 提供有关您问题的详细信息。 我只是想知道这是否单独起作用,或者自定义 change_list.html 也是必要的,以便有效地呈现自定义。这看起来几乎完全是我的问题。 自定义 change_list.html(就像 OP 对 admin/Homepage/view.html 所做的那样)是必要的。以上是关于Django 管理站点 change_list 视图自定义的主要内容,如果未能解决你的问题,请参考以下文章
试图在 django admin 中显示/隐藏 change_list 过滤器