Django formset引发了KeyError`form-0-id`

时间:2017-09-03 03:58:12

标签: python html django forms django-forms

我正在尝试保存一个formset,但我一直在

string labelledshape

list_ = super(MultiValueDict, self).__getitem__(key) KeyError: 'form-0-id' During handling of the above exception, another exception occurred: ... django.utils.datastructures.MultiValueDictKeyError: "'form-0-id'" 引发了同样的错误。

Here's a question似乎非常接近,但在modelformset.forms之前添加{{form.id}}似乎没有帮助。

数据库表中有一个自动生成的{%for field in form.visible_fields %}字段,但未在模型中明确指定(不确定是否相关)。 id未出现在任何表单代码或字段或模型代码中。 id只是id自动生成的数据库列。

以下是我发布的视图:

views.py

migrate

forms.py

def list_page(request, list_id):

    image_path = get_image_path(list_id)

    ordered_men = OrderedTable.objects.filter(list_id=list_id)
    ordered_men = list(enumerate(
        sorted(ordered_men, key=str)
    ))
    print(f'there are {len(ordered_men)} men')
    OrderedManInputFormSet = modelformset_factory(
        OrderedManInput,
        fields=fields,
        form=OrderedManInputForm, extra=0)

    ordered_man_input_formset = OrderedManInputFormSet(
        form_kwargs={
            'choices': ordered_men,
        }
    )

    return render(
        request, 'collector/list.html',
        {
            'list_id': list_id,
            'image_path': image_path,
            'formset': ordered_man_input_formset,
        }
    )


def submit(request, list_id):

    OrderedManInputFormSet = modelformset_factory(
        OrderedManInput,
        form=OrderedManInputForm,
        fields=fields,
        extra=0,
    )
    modelformset = OrderedManInputFormSet(request.POST)

    print('testing validity')
    if modelformset.is_valid():
        print('saving')
        modelformset.save()

    return HttpResponseRedirect(
        reverse('collector:thanks')
    )


def thanks(request):
    return render(request, 'collector/thanks.html')

这是发布帖子的模板:

class OrderedManInputForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):

        super(OrderedManInputForm, self).__init__(args, kwargs)
        if 'choices'in kwargs:
            # This works
            self.fields['full_name'] = forms.ChoiceField(
                choices=[('', '     ')] + kwargs['choices'],
                required=False
            )

    class Meta:
        model = OrderedManInput
        widgets = {}
        text_fields = [
            ...
        ]
        boolean_fields = [
            ...
        ]
        widgets.update({
            field: forms.TextInput()
            for field in text_fields
        })
        widgets.update({
            field: forms.CheckboxInput()
            for field in boolean_fields
        })
        fields = text_fields + boolean_fields
        labels = {
            ...
        }

所以每行都是一个表单,每列都是一个字段:

enter image description here

回溯:

    <form action="{% url 'collector:submit' list_id %}" method="POST" enctype="multipart/form-data">
      {% csrf_token %}
      {{ formset.management_form }}

      <table id="id_data_table">
        {% for form in formset %}
           {{form.id}}
        {% if forloop.first %}
          <thead><tr>
            {% for field in form.visible_fields %}
              <th>{{ field.label|capfirst }}</th>
            {% endfor %}
          </tr></thead>
        {% endif %}
        <tr>
          {%for field in form.visible_fields %}
            <td>
              {{field}}
            </td>
          {%endfor%}
        </tr>
      {% endfor %}
    </table>
    <p/>
    <div class="div-submit">
          <input type="submit"/>
    </div>
  </form>

[03/Sep/2017 00:08:21] "GET /collector/183618 HTTP/1.1" 200 20455 [03/Sep/2017 00:08:21] "GET /static/style.css HTTP/1.1" 200 1123 [03/Sep/2017 00:08:21] "GET /static/admin/js/vendor/jquery/jquery.js HTTP/1.1" 200 258648 [03/Sep/2017 00:08:21] "GET /static/lists_of_men_cropped/41550_1821100522_1170-01047.jpg HTTP/1.1" 404 1769 [03/Sep/2017 00:08:21] "GET /static/lists_of_men_cropped/41550_1821100522_1170-01047.jpg HTTP/1.1" 404 1769 Not Found: /favicon.ico [03/Sep/2017 00:08:21] "GET /favicon.ico HTTP/1.1" 404 2078 testing validity Internal Server Error: /collector/183618/submit/ Traceback (most recent call last): File "/home/user/Documents/site/venv/lib/python3.6/site-packages/django/utils/datastructures.py", line 83, in __getitem__ list_ = super(MultiValueDict, self).__getitem__(key) KeyError: 'form-0-id' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/user/Documents/site/venv/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner response = get_response(request) File "/home/user/Documents/site/venv/lib/python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response response = self.process_exception_by_middleware(e, request) File "/home/user/Documents/site/venv/lib/python3.6/site-packages/django/core/handlers/base.py", line 185, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/home/user/Documents/site/crowdsource/collector/views.py", line 87, in submit if modelformset.is_valid(): File "/home/user/Documents/site/venv/lib/python3.6/site-packages/django/forms/formsets.py", line 321, in is_valid self.errors File "/home/user/Documents/site/venv/lib/python3.6/site-packages/django/forms/formsets.py", line 295, in errors self.full_clean() File "/home/user/Documents/site/venv/lib/python3.6/site-packages/django/forms/formsets.py", line 344, in full_clean form = self.forms[i] File "/home/user/Documents/site/venv/lib/python3.6/site-packages/django/utils/functional.py", line 35, in __get__ res = instance.__dict__[self.name] = self.func(instance) File "/home/user/Documents/site/venv/lib/python3.6/site-packages/django/forms/formsets.py", line 144, in forms for i in range(self.total_form_count())] File "/home/user/Documents/site/venv/lib/python3.6/site-packages/django/forms/formsets.py", line 144, in <listcomp> for i in range(self.total_form_count())] File "/home/user/Documents/site/venv/lib/python3.6/site-packages/django/forms/models.py", line 603, in _construct_form pk = self.data[pk_key] File "/home/user/Documents/site/venv/lib/python3.6/site-packages/django/utils/datastructures.py", line 85, in __getitem__ raise MultiValueDictKeyError(repr(key)) django.utils.datastructures.MultiValueDictKeyError: "'form-0-id'" [03/Sep/2017 00:09:02] "POST /collector/183618/submit/ HTTP/1.1" 500 112006 来自于我在回复下面提出的答案时添加的内容。

testing validity

在Chrome中查看来源(匿名字段名称;其中没有一个是print('testing validity') if modelformset.is_valid(): print('saving') modelformset.save() ):

id

1 个答案:

答案 0 :(得分:0)

我认为您必须在保存表单集之前调用<script> setTimeout(function() { document.getElementsByClassName('playerButton play')[0].click(); }, 5000); </script> ,即使您100%确定表单有效:

is_valid