在Django 1.7 ModelMultipleChoiceField中指定/过滤所有相关的子任务必须共享一个项目

时间:2015-01-22 09:50:22

标签: django django-forms

我正在尝试过滤我的Task表单,以便在您选择任何子任务时,他们必须共享“超级任务”项目。

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

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说它不承认'任务'。

如果我试图通过保存来完成任务,PyLint也会警告我它不起作用:

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

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

我如何做到这一点?

1 个答案:

答案 0 :(得分:2)

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))
相关问题