2016-08-14 175 views
0

我會從展示如何開始我的模型看:過濾ForeignKey的Django的管理面板

from django.db import models 

class Project(models.Model): 
    #..... 
    pu = models.ForeignKey('Person', default='', related_name='pu') 
    se = models.ForeignKey('Person', default='', related_name='se') 

class Person(models.Model): 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50)  
    department = models.ForeignKey('Department', default='') 

class Department(models.Model): 
    abbreviation = models.CharField(default='', max_length=3) 
    full_name = models.CharField(default='', max_length=20) 

我希望讓所有的人在一個表中,但在我的管理面板我想說明兩個獨立的過濾列表:

  • 爲PU我想只顯示該人系 的縮寫是「PU」
  • 硒我想只顯示其中的人系 的縮寫是「SE」

我搜索了很多,但我對django和Python很陌生。

我該如何實現它?

回答

0

django admin解決辦法通常是可能的,但有點黑客行爲。

嘗試創建一個的myapp/admin.py文件

from django.contrib import admin 
from .models import Project, Person 


class ProjectAdmin(admin.ModelAdmin): 
    ... 
    filter_horizontal = ('pu', 'se') 

    def get_form(self, request, obj=None, **kwargs): 
     form = super(ProjectAdmin, self).get_form(request, obj, **kwargs) 
     if obj: 
      form.base_fields['pu'].queryset = Person.objects.filter(department__abbreviation__startswith='pu') 
      form.base_fields['se'].queryset = Person.objects.filter(department__abbreviation__startswith='se') 
     return form 


admin.site.register(Project, ProjectAdmin) # register it 
0

我改變了我的模型。 我不會使用Person和Department,我已經切換到Django的用戶和組。

按照我的需要過濾它我用limit_choices_to

pu = models.ForeignKey("auth.User", related_name='pu', limit_choices_to={'groups__name': "Purchasing"}) 
se = models.ForeignKey("auth.User", related_name='se', limit_choices_to={'groups__name': "Sales"}) 

我基於這樣的回答:Django, filter users by group in a model foreign key