【问题标题】:Retrieve Data From ManyToMany Field in Form Django从表单 Django 中的多对多字段中检索数据
【发布时间】:2018-07-25 14:51:38
【问题描述】:

我正在尝试从用户可以为组权限选择多个选项的模型表单中检索数据;为此,我使用的是多对多关系。

表格的结构如下:

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 模型具有多对多关系。问题是,由于我手动写出表单(boss'choice),表单检索到的查询集是空的(尽管 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>

谢谢

【问题讨论】:

  • 你需要展示模板和视图。
  • 抱歉,我马上添加

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


【解决方案1】:

你没有给你的复选框一个name属性,所以浏览器永远不会发送任何数据。应该是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-26
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    相关资源
    最近更新 更多