我有一個名爲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