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

时间:2011-05-23 21:15:47

标签: python django django-admin

这是我的情况:
我有三种模式:成绩,课程和课程。 Grade具有课程和课程的外键,具有编程的外键。

这是我的问题:
当我需要在管理面板中添加一些成绩时,我有一个完整的课程列表框。第一个问题:在两个不同的程序中可以找到相同的课程名称,并且很难在列表框中识别。现在它显示为Program.name - Course.name

当我想创建或修改成绩时,我想知道是否有任何解决方案可以帮助我按程序过滤我的课程列表。 (我说的是成绩创建界面,而不是该界面之前的列表)。

编辑:
谢谢你的回答。我想我必须使用AJAX编写我自己的小部件,使用我的过滤器客户端。

2 个答案:

答案 0 :(得分:0)

我有类似的问题,这是我来的解决方案:

在课程的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 :(得分:0)

您可以使用AJAX编写这样的过滤器(使用jQuery或类似的框架将是最简单的方法)。您将创建一个包含两个列表的自定义表单窗口小部件第一个将在加载页面时由服务器填充所有可用程序。然后,您的javascript将等待进行选择,然后向服务器(即AJAX部分)询问该程序中的课程列表,并相应地更新第二个列表。

然而,对于你的情况,我会说这是矫枉过正;它会更容易做jammon's answer says并将Grade模型的管理员放在相应的课程管理员中(这称为内联模型管理员;请参阅有关该主题的the Django documentation)。不幸的是,他们的答案中给出的示例代码不起作用,所以我创建了以下适用于我的示例。

配置Django管理员的基本方法是在admin.py中使用管理站点注册您的模型。你可能正在做以下几点事情:

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.TabularInlineadmin.StackedInline。通常情况下,我更喜欢TabularInline的外观,但它可能取决于您的模型,所以请尝试两者。 extra选项定义将向用户显示多少空白表单。

接下来,我们需要告诉课程管理页面添加内联表单:

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

最后,我们不再希望显示独立的成绩管理员,因此我们无需在管理站点注册。相反,我们必须指定我们的自定义管理类用于课程模型。这意味着应用程序的最终admin.py文件如下:

from django.contrib import admin
from myapp.models import Program, Course, 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)