我有一个名为projects的应用程序。其中一个字段为contributors
,其中用户列表以ManyToManyField
存储。我试图使用户可以在列表中添加和删除用户。使用ModelChoiceField
与所有用户的传递查询集一起添加已相当简单。从列表中删除用户仍然没有。我想了解的是如何以及在哪里传递额外的参数,以便我可以在窗体中处理查询,因此它只会列出来自特定项目的用户。Django中ManyToManyField的具有特定参数的窗体中自定义查询
添加用户
models.py
# Model for projects
class Project(models.Model):
...
contributors = models.ManyToManyField(User, blank=True)
...
forms.py
class AddUserForm(forms.Form):
user = forms.ModelChoiceField(queryset=User.objects.all())
class Meta:
model = Project
fields = [
"user",
]
views.py
# Add task to a project
@login_required()
def projects_adduser(request, id):
# Fetch the project if it exists
project = get_object_or_404(Project, id=id)
# Form for adding users to contributors list
form = AddUserForm(request.POST or None)
# Validate the form
if form.is_valid():
user = form.cleaned_data.get("user")
project.contributors.add(user)
project.save()
messages.success(request, "User successfully added to project!")
return HttpResponseRedirect(project.get_edit_url())
# Context dict to return for template
context = {
"title": "Add user to project: " + project.title,
"form": form,
"instance": project,
}
return render(request, template + '/form.html', context)
酷!我没有想出这个。我自己测试了它。它要简单得多,而且似乎更好。谢谢,我也学到了! – Jayground
回复你删除的问题)它会返回所有在Project模型中与项目连接的用户。 SQL查询将如下所示:'SELECT * FROM“auth_user”INNER JOIN“projects_project”ON(“auth_user”。“id”=“projects_project”。“user_id”)WHERE“projects_project”。“id”= 1' – devxplorer
谢谢,这是迄今为止最简单的解决方案,正是我所期待的。它实际上帮助我从views.py中移除了一些函数并简化了代码。我不知道你可以从forms.py之外操作窗体,我正在寻找如何将参数传递给forms.py中的窗体本身。呃...新手,对吧? :P – Ablivion