2015-03-19 129 views
1

使用Django管理員時遇到問題。我正在構建一個小型的ScrumBoard。它有項目,狀態,故事和任務。如何將選項限制在Django中的外鍵管理員

考慮以下模型:

@python_2_unicode_compatible 
class Project(models.Model): 
    name = models.CharField(max_length=100) 

    class Meta: 
     verbose_name = _('Project') 
     verbose_name_plural = _('Projects') 

    def __str__(self): 
     return self.name 

@python_2_unicode_compatible 
class Status(models.Model): 
    name = models.CharField(max_length=64) # e.g. Todo, In progress, Testing Done 
    project = models.ForeignKey(Project) 

    class Meta: 
     verbose_name = _('Status') 
     verbose_name_plural = _('Statuses') 

    def __str__(self): 
     return self.name 


@python_2_unicode_compatible 
class Story(models.Model): 
    """Unit of work to be done for the sprint. Can consist out of smaller tasks""" 
    project = models.ForeignKey(Project) 
    name=models.CharField(max_length=200) 
    description=models.TextField() 
    status = models.ForeignKey(Status) 

    class Meta: 
     verbose_name = _('Story') 
     verbose_name_plural = _('Stories') 

    # represent a story with it's title 
    def __str__(self): 
     return self.name 

的問題:當一個管理員用戶創建了一個故事,他會看到所有的項目,而不是從一個項目的狀態狀態。

+0

這是正常的,即使你自定義您的管理,對創作,你無法猜測什麼狀態必須列出 – christophe31 2015-03-19 11:02:59

+0

我明白這個問題:沒有辦法預先選擇項目(例如在查詢字符串或通過http post),然後顯示狀態表單的其餘部分,而無法選擇另一個項目。 – acidjunk 2015-03-19 16:27:35

+0

通過自定義管理模型表單,您可以在創建後(修改時)使用子集。 – christophe31 2015-03-19 17:37:27

回答

2

要過濾的項目狀態,你需要你的故事已經存在這樣的Django知道我們在談論哪些項目。如果設置狀態nullalble,你可以這樣做(這意味着,你保存和繼續先保存設置狀態)

class StatusAdmin(admin.ModelAdmin): 
    def get_form(self, request, obj=None, **kwargs): 
     form = super(StatusAdmin, self).get_form(request, obj, **kwargs) 
     if obj and obj.project: 
      form.base_fields['status'].queryset = \ 
       form.base_fields['status'].queryset.filter(project=obj.project) 
     elif obj is None and 'status' in form.base_fields: # on creation 
      del form.base_fields['status'] 
     return form 
+0

您的解決方案似乎「幾乎」工作。但get_form()會被調用兩次。 – acidjunk 2015-03-24 10:25:18

+0

我在生產過程中使用了一個可比較的代碼(事實上覆雜的mixin可以實現更多的自動化操作,但是在模型中將某些特定的定義暗示爲for_user類的方法......)沒有問題。你有堆棧跟蹤嗎? – christophe31 2015-03-24 14:14:37

+0

正如你所說,它被稱爲兩次,我想你的問題是在德爾線。你不能使用自定義表單的片段。 (因爲我重寫每一次默認行爲)(#form = MyForm)。管理員默認行爲是每次都生成一個新的FormClass,我依賴它。 (我添加了一個快速編輯,以避免雙del) – christophe31 2015-03-25 08:48:46