Skip to main content
 首页 » 编程设计

python之使用 Django 中的 ManyToManyField 的特定参数在表单中自定义查询

2025年05月04日47lidabo

我有一个名为 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 连接