我正在尝试从模型表单中检索数据,在该模型中,用户可以为组权限选择多个选项;为此,我正在使用ManyToMany关系。
表单的结构如下:
class GroupForm(ModelForm):
class Meta:
model = Gruppo
fields = ("nome", "Autorizzazioni")
def __init__(self, *args, **kwargs):
super(GroupForm, self).__init__(*args, **kwargs)
self.fields["Autorizzazioni"].widget = CheckboxSelectMultiple()
self.fields["Autorizzazioni"].queryset = Permesso.objects.all()
self.fields["Autorizzazioni"].required = False
名为Autorizzazioni的字段与Permesso模型具有ManyToMany关系。问题在于,由于我是手动将表单写出来的(老板选择),因此表单检索的查询集为空(尽管ID设置正确)
这意味着不会保存用户所做的任何选择,并且不再选择已经选择的选项。我使用一个简单的form.save(),根据文档,它还应该保存m2m关系。
你们能帮我吗?
编辑:
这是视图:
def gruppo_detail(request, id=None):
if not request.user.is_authenticated or not can_view(request):
return redirect("/")
instance = get_object_or_404(Gruppo, id=id)
permessi = Permesso.objects.all()
if request.method == "POST":
form = GroupForm(request.POST, instance=instance)
if form.is_valid():
form.save()
action.send(request.user, verb="ha modificato il gruppo", target=instance, ip=get_ip(request))
return redirect("/gruppi/")
else:
form = GroupForm(instance=instance)
这是模板:
<form class="m-form m-form--fit m-form--label-align-right" method="POST" action="{{request.path}}" enctype="multipart/form-data">
{% csrf_token %}
<!-- begin:: Portlet Body-->
<div class="m-portlet__body">
<div class="form-group m-form__group row">
{{form.nome.errors}}
<label for="id_nome" class="col-lg-2 col-form-label"><span class="m--font-danger" aria-required="true">* </span> Nome</label>
<div class="col-lg-4">
<input type="text" class="form-control m-input" name="nome" value="{{gruppo.nome}}" id="id_nome" required>
</div>
</div>
<div class="form-group m-form__group row">
<label for="id_Autorizzazioni" class="col-lg-2 col-form-label">Autorizzazioni</label>
<div class="col-lg-10">
<div class="m-checkbox-list">
{% for permesso in permessi %}
<label class="m-checkbox">
{% is_present permesso gruppo.Autorizzazioni.all as checked %}
<input type="checkbox" id="id_Autorizzazioni_{{permesso.id}}" value="{{permesso.id}}" {% if checked %} checked {% endif %}>{{permesso.nome}}
<span></span>
</label>
{% endfor %}
</div>
</div>
</div>
</div>
{% include '_bottom_add.html' %}
</form>
谢谢
答案 0 :(得分:0)
您没有为复选框提供name
属性,因此浏览器将永远不会发送任何数据。应该是:
<input type="checkbox" name="Autorizzazioni" id="id_Autorizzazioni_{{permesso.id}}" value="{{permesso.id}}" {% if checked %} checked {% endif %}>{{permesso.nome}}