【发布时间】:2009-08-06 14:53:42
【问题描述】:
我有一个名为 Project 的模型,它有一个 m2m 字段用户。我有一个带有 FK 项目的任务模型。它有一个字段assigned_to。如何将assigned_to 的选择限制为仅限当前项目的用户?
【问题讨论】:
标签: python django-models
我有一个名为 Project 的模型,它有一个 m2m 字段用户。我有一个带有 FK 项目的任务模型。它有一个字段assigned_to。如何将assigned_to 的选择限制为仅限当前项目的用户?
【问题讨论】:
标签: python django-models
你可以用另一种方式做到这一点,使用这个漂亮的表单工厂技巧。
def make_task_form(project):
class _TaskForm(forms.Form):
assigned_to = forms.ModelChoiceField(
queryset=User.objects.filter(user__project=project))
class Meta:
model = Task
return _TaskForm
然后从您的视图代码中,您可以执行以下操作:
project = Project.objects.get(id=234)
form_class = make_task_form(project)
...
form = form_class(request.POST)
【讨论】:
您需要创建一个custom form for the admin。
您的表单应该包含一个ModelChoiceField,您可以在其中指定一个定义可用选项的查询集参数。此表单可以是 ModelForm。
(以下示例假设用户对您的项目模型具有 FK)
forms.py
from django import forms
class TaskForm(forms.ModelForm):
assigned_to = forms.ModelChoiceField(queryset=Users.objects.filter(user__project=project))
class Meta:
model = Task
然后将表单分配给 ModelAdmin。
admin.py
from django.contrib import admin
from models import Task
from forms import TaskForm
class TaskAdmin(admin.ModelAdmin):
form = TaskForm
admin.site.register(Task, TaskAdmin)
【讨论】:
__init__ 方法才能使其正常工作。