在 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))
我正在尝试过滤我的 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))