首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以在Django管理面板中过滤外键上的选项吗?

可以在Django管理面板中过滤外键上的选项吗?
EN

Stack Overflow用户
提问于 2011-05-24 05:15:47
回答 2查看 1.1K关注 0票数 3

这是我的情况:

我有三个模型:年级、课程和课程。成绩是课程的外键,课程是课程的外键。

这就是我的问题:

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

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

编辑:

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-24 16:11:00

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

然而,对于您的情况,我会说这有点过头了;作为jammon's answer says并将年级模型的管理员放在相应的课程管理员中会容易得多(这称为内联模型管理员;请参阅主题上的the Django documentation )。不幸的是,他们的答案中给出的示例代码不起作用,所以我创建了以下示例,它对我有效。

配置Django admin的基本方法是在admin.py中的admin站点注册您的模型。您可能正在按照以下方式做一些事情:

代码语言:javascript
复制
from django.contrib import admin
from myapp.models import Program, Course, Grade

admin.site.register(Program)
admin.site.register(Course)
admin.site.register(Grade)

相反,我们希望在课程本身的管理部分中编辑课程的成绩。首先,我们需要为成绩定义一个内联管理类:

代码语言:javascript
复制
class GradeInline(admin.TabularInline):
    model = Grade
    extra = 1

注您可以选择从admin.TabularInlineadmin.StackedInline继承。通常,我更喜欢TabularInline的外观,但它可能取决于你的型号,所以两个都试一下。extra选项定义将向用户显示多少空白表单。

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

代码语言:javascript
复制
class CourseAdmin(admin.ModelAdmin):
    model = Course
    inlines = (GradeInline,)

最后,我们不再想要显示独立的等级管理,所以我们不需要在管理站点注册它。相反,我们必须指定将我们的自定义管理类用于课程模型。这意味着应用程序的最终admin.py文件如下所示:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2011-05-24 12:33:18

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

当然,在ModelAdmin中为等级定义一个InlineModelAdmin。

代码语言:javascript
复制
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)‘的内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6103132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档