从表格Django的ManyToMany字段中检索数据

时间:2018-07-25 14:51:38

标签: django django-models django-forms django-templates

我正在尝试从模型表单中检索数据,在该模型中,用户可以为组权限选择多个选项;为此,我正在使用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>

谢谢

1 个答案:

答案 0 :(得分:0)

您没有为复选框提供name属性,因此浏览器将永远不会发送任何数据。应该是:

<input type="checkbox" name="Autorizzazioni" id="id_Autorizzazioni_{{permesso.id}}" value="{{permesso.id}}" {% if checked %}  checked {% endif %}>{{permesso.nome}}