【问题标题】:Django form using model_formset not submitting使用model_formset的Django表单未提交
【发布时间】:2022-01-01 11:15:03
【问题描述】:

我正在尝试创建一个屏幕来显示我的应用程序中的所有用户,然后能够为用户更新显示的字段。基本上是用户的管理员视图。我希望能够通过点击提交一次更新多个用户。

我使用 modelformsets 来完成这项工作,并从 answer to another question 复制了 html,以便内联显示表单(见下文)。

HTML模板:

               <div class="card-body">
              <form action="{% url 'bugtracker:users' %}" method='POST'>
                <table id="formset" class="form">
                  {{ formset.non_form_errors.as_ul }}
                  {{ formset.management_data }}
                  {% csrf_token %}
                  {% for form in formset.forms %}
                  {% if forloop.first %}
                <thead><tr>
                  {% for field in form.visible_fields %}
                  <th>{{ field.label|capfirst }}</th>
                  {% endfor %}
                </tr></thead>
                {% endif %}
                <tr class="{% cycle 'row1' 'row2' %}">
                  {% for field in form.visible_fields %}
                  <td>
                    {# Include the hidden fields in the form #}
                    {% if forloop.first %}
                    {% for hidden in form.hidden_fields %}
                    {{ hidden }}
                    {% endfor %}
                    {% endif %}
                    {{ field.errors.as_ul }}
                    {{ field }}
                  </td>
                  {% endfor %}
                </tr>
                {% endfor %}
              </table>
              <button class="btn btn-primary" type="submit">Submit</button>
            </form>
            </div>

观点:

@login_required
def users(request):
    # users = User.objects.all()
    UserFormSet = modelformset_factory(User,fields=('username','first_name','last_name','email','is_contributor','is_projectmanager','is_administrator'), extra=0)
    if request.method == 'POST':
        formset = UserFormSet(request.POST or None)
        print(formset)
        if formset.is_valid():
            formset.save(commit=True)
            messages.success(request,f"save successfull")
            return HttpResponseRedirect(reverse("bugtracker:users"))
        else:
            print("error")
            for form in formset:
                print(form.cleaned_data) 
            messages.success(request,f"error")
            return HttpResponseRedirect(reverse("bugtracker:users"))

    formset = UserFormSet()
    context = {
        # 'users':users,
        'formset':formset,
    }
    return render(request, 'bugtracker_app/users.html', context)

我发现表单无效,因此没有保存。 form.cleaned_data 如下所示:

<tr><td colspan="2"><ul class="errorlist nonfield"><li>(Hidden field TOTAL_FORMS) This field is required.</li><li>(Hidden field INITIAL_FORMS) This field 
is required.</li></ul><input type="hidden" name="form-TOTAL_FORMS" id="id_form-TOTAL_FORMS"><input type="hidden" name="form-INITIAL_FORMS" id="id_form-INITIAL_FORMS"><input type="hidden" name="form-MIN_NUM_FORMS" id="id_form-MIN_NUM_FORMS"><input type="hidden" name="form-MAX_NUM_FORMS" id="id_form-MAX_NUM_FORMS"></td></tr>

这是我第一次使用模型表单集或一般表单集。有人可以告诉我为什么我的表单没有正确保存,以及如何修改我的代码以保持我的表格的形状,但在我点击提交时仍然保存所有记录?

【问题讨论】:

    标签: django forms django-views django-forms formset


    【解决方案1】:

    我找到了答案:

    在我输入的模板中,{{ formset.management_data }} 应该是 {{ formset.management_form }}。我使用的文档是here

    我还必须将{{ formset.management_form }} 移动到表格标签中。

    完整的工作 HTML 在这里:

              <form action="{% url 'bugtracker:users' %}" method='POST'>
                <table id="formset" class="form">
                  {{ formset.management_form }}
                  {{ formset.non_form_errors.as_ul }}
                  {% csrf_token %}
                  {% for form in formset.forms %}
                    {% if forloop.first %}
                    <thead><tr>
                      {% for field in form.visible_fields %}
                        <th>{{ field.label|capfirst }}</th>
                      {% endfor %}
                    </tr></thead>
                    {% endif %}
                  <tr class="{% cycle 'row1' 'row2' %}">
                    {% for field in form.visible_fields %}
                    <td>
                      {# Include the hidden fields in the form #}
                      {% if forloop.first %}
                        {% for hidden in form.hidden_fields %}
                          {{ hidden }}
                        {% endfor %}
                      {% endif %}
                      {{ field.errors.as_ul }}
                      {{ field }}
                    </td>
                    {% endfor %}
                  </tr>
                  {% endfor %}
              </table>
              <button class="btn btn-primary" type="submit">Submit</button>
            </form>
    

    【讨论】:

      猜你喜欢
      • 2017-05-13
      • 2012-03-09
      • 2015-04-02
      • 2011-09-01
      • 2017-07-26
      • 2013-08-04
      • 2020-11-09
      相关资源
      最近更新 更多