2015-03-19 85 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

相关问题