2011-05-23 51 views
3

这是我的情况:
我有三个模型:成绩,课程和程序。 等级有课程和课程的外键有程序的外键。是否可以过滤Django管理面板中的外键选项?

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

我想知道是否有任何解决方案可以帮助我按程序过滤我的课程列表,当我想创建或修改成绩时。 (我正在谈论成绩创建界面,而不是该界面之前的列表)。编辑:
感谢您的回答。我想我必须编写自己的小部件,使用AJAX过滤客户端。

+1

你说的是客户端筛选,即选择一个程序,该课程列表的变化,以反映该程序只课程?或者,您是否想在运行时通过特定程序过滤课程列表? – 2011-05-23 21:32:10

回答

0

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

但是,对于你的情况,我会说这是矫枉过正;作为jammon's answer says将更容易做到,并将相应课程管理员中的成绩模型的管理员(这称为内嵌模型管理员;请参阅有关主题的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) 
0

我也有类似的问题,这里是我来解决:

定义甲级InlineModelAdmin在课程的ModelAdmin。

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)'的内容。