这是我的情况:
我有三个模型:年级、课程和课程。成绩是课程的外键,课程是课程的外键。
这就是我的问题:
当我需要在我的管理面板中添加一些成绩时,我当然有一个满满的列表框。第一个问题:在两个不同的程序中可以找到相同的课程名称,并且很难在列表框中进行识别。目前,它显示为Program.name - Course.name
我想知道当我想创建或修改成绩时,是否有任何解决方案可以帮助我按程序过滤课程列表。(我说的是成绩创建接口,而不是该接口之前的列表)。
编辑:
谢谢你的回答。我想我必须用AJAX编写我自己的小部件,使我的过滤器成为客户端。
发布于 2011-05-24 16:11:00
您可以使用AJAX编写这样的过滤器(使用jQuery或类似的框架将是最简单的方法)。您将创建一个具有两个列表的自定义表单小部件。当页面加载时,服务器将用所有可用程序填充第一个程序。然后,您的javascript将等待做出选择,然后向服务器(即AJAX部分)请求该程序中的课程列表,并相应地更新第二个列表。
然而,对于您的情况,我会说这有点过头了;作为jammon's answer says并将年级模型的管理员放在相应的课程管理员中会容易得多(这称为内联模型管理员;请参阅主题上的the Django documentation )。不幸的是,他们的答案中给出的示例代码不起作用,所以我创建了以下示例,它对我有效。
配置Django admin的基本方法是在admin.py中的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继承。通常,我更喜欢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)发布于 2011-05-24 12:33:18
我遇到了类似的问题,以下是我得到的解决方案:
当然,在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)‘的内容。
https://stackoverflow.com/questions/6103132
复制相似问题