在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']
列表中的子任务。