在Django 1.7 ModelMultipleChiceField中,指定/筛选所有相关子任务必须共享一个项目

在Django 1.7 ModelMultipleChiceField中,指定/筛选所有相关子任务必须共享一个项目,django,django-forms,Django,Django Forms,我正在尝试筛选我的任务表单,以便在选择任何子任务时,它们必须共享“超级任务”项目 下面是我的任务和依赖关系模型的简单介绍: class Task(models.Model): title = models.CharField(max_length=100) description = models.TextField(blank=True) project = models.ForeignKey('Project', related_name="tasks") d

我正在尝试筛选我的
任务
表单,以便在选择任何子任务时,它们必须共享“超级任务”项目

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

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")
这就是我在表格上“试图逃脱”的原因:

class TaskForm(forms.ModelForm):
    subtasks=forms.ModelMultipleChoiceField(queryset=
                                    Task.objects.filter(project=task.project))
    class Meta:
        model = Task
        exclude = ('project',)
我的意思是,它看起来像是正确的“种类”,但派林说它不识别“任务”

如果我试图通过保存来获取任务,PyLint也会警告我它将无法工作:

 task = forms.ModelForm.save(commit=False)
PyLint在save方法中需要一个“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)
要将当前任务传递给表单,请使用
实例
参数:

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

self.instance
self.instance.pk
来自哪里?它们是
super.\uuuu init\uuuu
方法的一部分吗?他们会不会永远不存在?不管怎样,这是完美的。很遗憾Django不允许这样做,但这是一种更好的方法。将
instance
参数传递给表单的构造函数。是的,这就是您问题的答案。请参见更新答案中的表单创建示例。
子任务
表单字段不是
任务
模型字段的一部分,因此您必须自行处理。重写
TaskForm.save()
方法并保存
self.cleaned_data['subtasks']
列表中的子任务。