2011-05-23 81 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)'的內容。