不久前我做了类似的事情。
这是模型、形式和视图。有什么不清楚的地方问一下。
from django import forms
from django.db import models
from django.shortcuts import redirect
class Personnel(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
# other fields
class AddPersonnelToGroupForm(forms.Form):
personnels = forms.ModelMultipleChoiceField(
queryset=Personnel.objects.all(),
widget=forms.SelectMultiple(attrs={"class" : "form-control select-multiple"}))
def add_personnels_to_group(request, pk): # pk is group's pk
"""Recursively add personnels to a group"""
template = "personnel/add_personnels_to_group.html"
group = Group.objects.get(pk=pk)
if request.method == "POST":
form = AddPersonnelToGroupForm(request.POST)
if form.is_valid():
personnels = [Personnel.objects.get(pk=pk) for pk in request.POST.getlist("personnels", "")]
for personnel in personnels:
user = personnel.user
if user.groups.filter(id=group.id).count():
user.groups.remove(group)
else:
user.groups.add(group)
msg.append("{} added".format(personnel.display_name))
return redirect(wherever)
else:
form = AddPersonnelToGroupForm()
return render(request, template, {"form" : form, "group" : group})
编辑
from django import forms
from django.db import models
from django.contrib.auth.models import Group
from django.shortcuts import redirect
class Personnel(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
# other fields
class AddPersonnelToGroupForm(forms.Form):
personnels = forms.ModelMultipleChoiceField(
queryset=Personnel.objects.all(),
widget=forms.SelectMultiple(attrs={"class" : "form-control select-multiple"}))
group = forms.ModelChoiceField(
queryset=Group.objects.all(),
widget=forms.Select(attrs={"class" : "form-control select-multiple"})
)
def add_personnels_to_group(request): # pk is group's pk
"""Recursively add personnels to a group"""
template = "personnel/add_personnels_to_group.html"
# group = Group.objects.get(pk=pk) # replace this
if request.method == "POST":
form = AddPersonnelToGroupForm(request.POST)
if form.is_valid():
group = form.cleaned_data['group'] # replacement
personnels = [Personnel.objects.get(pk=pk) for pk in request.POST.getlist("personnels", "")]
for personnel in personnels:
user = personnel.user
if user.groups.filter(id=group.id).count():
user.groups.remove(group)
else:
user.groups.add(group)
msg.append("{} added".format(personnel.display_name))
return redirect(wherever)
else:
form = AddPersonnelToGroupForm()
return render(request, template, {"form" : form, "group" : group})
所以在你的表单模板中你需要字段
{{ form.group }}
{{ form.personnels }}