繁体   English   中英

是否可以在 Django 管理面板中过滤外键选项?

[英]Is it possible to filter choices on a foreign key in Django Admin panel?

这是我的情况:
我有三个模型:Grade、Course 和 Program。 Grade 具有 Course 的外键,Course 具有 Program 的外键。

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

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

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

我遇到了类似的问题,这是我得到的解决方案:

在课程的 ModelAdmin 中为 Grade 定义一个 InlineModelAdmin。

class CourseAdmin(admin.ModelAdmin):
    class GradeInline(admin.StackedInline):
        model = Grade
        fk_name = 'course'
        extra = 2
        and so on

然后,您可以在他们所属课程的 change_view 中添加和编辑成绩,您根本不需要 select 课程。

为了在列表中区分不同程序的课程,我将重新定义course.__unicode__以返回类似“grade.name (program.name)”的内容。

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

但是,对于您的情况,我会说这是矫枉过正; 正如jammon 的回答所说,将 model 年级的管理员放在相应的课程管理员中会容易得多(这被称为内联 model 管理员;请参阅主题上的 ZEF0F93C83E374836A61DA0D4D 文档)。 不幸的是,他们的答案中给出的示例代码不起作用,所以我创建了以下适用于我的示例。

配置 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:

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

请注意,您可以选择从admin.TabularInlineadmin.StackedInline继承。 通常,我更喜欢TabularInline的外观,但它可能取决于您的 model,因此请尝试两者。 extra选项定义将向用户显示多少个空白 forms。

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

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

最后,我们不再希望显示独立成绩管理员,因此我们不需要在管理站点注册它。 相反,我们必须指定我们的自定义管理员 class 用于课程 model。 这意味着应用程序的最终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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM