在 Django 1.7 ModelMultipleChoiceField specify/filter 所有相关子任务必须共享一个项目

In Django 1.7 ModelMultipleChoiceField specify/filter all related subtasks must share a project

我正在尝试过滤我的 Task 表单,以便当您 select 任何子任务时,它们必须共享 'super-tasks' 项目。

下面简单介绍一下我的任务和依赖模型:

class Task(models.Model):
    title = models.CharField(max_length=100)
    description = models.TextField(blank=True)
    project = models.ForeignKey('Project', related_name="tasks")
    dependency = models.ManyToManyField('self', through='Dependency', null=True, 
        blank=True, through_fields=('task', 'sub_task'), symmetrical=False)

class Dependency(models.Model):
    task = models.ForeignKey(Task, related_name="dependency_task")
    sub_task = models.ForeignKey(Task, related_name="dependency_sub_task")

这就是我 'trying to get away with' 在我的表格上:

class TaskForm(forms.ModelForm):
    subtasks=forms.ModelMultipleChoiceField(queryset=
                                    Task.objects.filter(project=task.project))
    class Meta:
        model = Task
        exclude = ('project',)

我的意思是它看起来像正确的 'sort',但 PyLint 说它无法识别 'task'。

如果我尝试通过保存来获取任务,PyLint 也会警告我它不会工作:

 task = forms.ModelForm.save(commit=False)

PyLint 期望在保存方法中有一个 'self' 参数,但不存在。

我该如何完成?

task 变量在 TaskForm 定义时不可用。您应该在构造函数中设置子任务的查询集:

class TaskForm(forms.ModelForm):

    subtasks=forms.ModelMultipleChoiceField(queryset=Task.objects.none())

    class Meta:
        model = Task
        exclude = ('project',)

    def __init__(self, *args, **kwargs):
        super(TaskForm, self).__init__(*args, **kwargs)
        if self.instance and self.instance.pk:
            self.fields['subtasks'].queryset = Task.objects.filter(
                                               project=self.instance.project)

要将当前任务传递给表单,请使用 instance 参数:

form = TaskForm(instance=Task.objects.get(pk=1))