是否可以在Django Admin面板中过滤外键上的选择?

问题描述

| 这是我的情况: 我有三种模式:年级,课程和课程。 成绩具有课程的外键,课程具有课程的外键。 这是我的问题: 当我需要在管理面板中添加一些成绩时,我会有一个充满课程的列表框。第一个问题:可以在两个不同的程序中找到相同的课程名称,并且很难在列表框中进行标识。现在,它显示为Program.name-Course.name 我想知道是否有什么解决方案可以帮助我在创建或修改成绩时按程序过滤课程列表。 (我说的是成绩创建界面,而不是该界面之前的列表)。 编辑: 感谢您的回答。我认为我必须编写自己的小部件,使我的过滤器客户端使用AJAX。     

解决方法

您可以使用AJAX编写这样的过滤器(使用jQuery或类似的框架是最简单的方法)。您将创建一个包含两个列表的自定义表单窗口小部件。加载页面时,服务器将使用所有可用程序填充第一个。然后,您的JavaScript将等待做出选择,然后向服务器(即AJAX部分)询问该程序中的课程列表,并相应地更新第二个列表。 但是,对于您的情况,我会说这太过分了。按照jammon的回答说,将“成绩”模型的管理员放在相应的“课程”管理员中(这称为内联模型管理员;请参阅该主题的Django文档),这样做会容易得多。不幸的是,他们的答案中给出的示例代码不起作用,因此我创建了以下对我有用的示例。 配置Django admin的基本方法是简单地在ѭ0中向admin站点注册模型。您可能正在执行以下操作:
from django.contrib import admin
from myapp.models import Program,Course,Grade

admin.site.register(Program)
admin.site.register(Course)
admin.site.register(Grade)
相反,我们要在课程本身的“管理”部分中编辑课程的成绩。首先,我们需要为该年级定义一个内联管理类:
class GradeInline(admin.TabularInline):
    model = Grade
    extra = 1
注意,您可以选择从
admin.TabularInline
admin.StackedInline
继承。通常,我更喜欢ѭ5的外观,但它可能取决于您的型号,因此请同时尝试。 “ 6”选项定义将向用户显示多少空白表格。 接下来,我们需要告诉“课程管理”页面添加内联表单:
class CourseAdmin(admin.ModelAdmin):
    model = Course
    inlines = (GradeInline,)
最后,我们不再希望显示独立等级的管理员,因此我们无需在管理员站点上注册。相反,我们必须指定将我们的自定义管理类用于课程模型。这意味着该应用程序的最终“ 0”文件如下:
from django.contrib import admin
from myapp.models import Program,Grade

class GradeInline(admin.TabularInline):
    model = Grade
    extra = 1

class CourseAdmin(admin.ModelAdmin):
    model = Course
    inlines = (GradeInline,)

admin.site.register(Program)
admin.site.register(Course,CourseAdmin)
    ,我遇到了类似的问题,这是我遇到的解决方案: 在课程的ModelAdmin中为成绩定义一个InlineModelAdmin。
class CourseAdmin(admin.ModelAdmin):
    class GradeInline(admin.StackedInline):
        model = Grade
        fk_name = \'course\'
        extra = 2
        and so on
然后,您可以在课程所属的change_view中添加和编辑成绩,而不必完全选择课程。 并且为了在清单中区分不同程序的课程,我将重新定义
course.__unicode__
以返回类似\'grade.name(program.name)\'的内容。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...