我有一个名为 projects 的应用程序。其中一个字段是 contributors,其中用户列表存储在 ManyToManyField 中。我试图使在列表中添加和删除用户成为可能。使用 ModelChoiceField 添加所有用户的已传递查询集非常容易。从列表中删除用户仍然让我望而却步。我想了解的是如何以及在何处传递附加参数,以便我可以处理表单中的查询,因此它将仅列出来自特定项目的用户。
添加用户
模型.py
# Model for projects
class Project(models.Model):
...
contributors = models.ManyToManyField(User, blank=True)
...
表单.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)
请您参考如下方法:
您可以将初始用户查询集传递给这样的表单:
form = AddUserForm()
form.fields["user"].queryset = User.objects.filter(project=project)
此外,您不需要调用 project.save(),project.contributors.add(user) 已经在执行查询以添加 m2m 连接
