当ModelForm CheckboxSelectMultiple选项为'id'时,'id'字段出现KeyError

时间:2019-09-17 07:17:40

标签: python django django-forms

我是Django的新手。我有一个表单,希望将模型项的“ id”列表作为CheckboxSelectMultiple字段的选择。这是我的例子

Models.py

class TryDjango(models.Model):
    name    = models.CharField(max_length=120)

Views.py

class trydjango_view(View):
    template_name = 'trydjango.html'
    failed_template = 'generic_error.html'

    viewContext = {
        "title" : "Page title ",
        "columnNames" : ["Name"],
        "url" : 'trydjango',
        'loginInfo' : 'logout',
    }

    def get(self, request):
        self.viewContext['deleteTryDjangoForm'] = \
            deleteTryDjangoForm(prefix='delete')
        login_result = getLogin(request)
        self.viewContext.update({'loginInfo' : login_result['loginInfo']})
        return render(request, self.template_name, self.viewContext)

trydjango.html模板

{% block tableHeader %}
  <tr>
    {% if user.is_authenticated %}
    <td>

      <form id="delItem" action="" method="post">
        {% csrf_token %}
        <input type="submit" value="Delete Django"
          name="{{deleteTryDjangoForm.prefix}}"/>
      </form>

    </td>
    {% endif %}
    {% for columnName in columnNames %}
      <th>{{columnName}}</th>
    {% endfor %}
  </tr>

{% endblock %}

ModelForms.py

    class deleteTryDjangoForm(forms.ModelForm):
    myPrefix ='delete-'

    class Meta:
        model = TryDjango
        fields = ['id']

    def __init__(self, *args, **kwargs):
        super(deleteTryDjangoForm,self).__init__(*args, **kwargs)
        sportSeriesList = listOfSportSeries()
        print(sportSeriesList)
        self.fields['id'].widget = \
            forms.CheckboxSelectMultiple(choices=[(1,1)]) #<<-- Line 399 in the error

最后我得到的错误

KeyError at /trydjango/
'id'
Request Method: GET
Request URL:    http://127.0.0.1:8000/trydjango/
Django Version: 2.0.7
Exception Type: KeyError
Exception Value: 'id'
Exception Location: /Users/sbt/dev/trydjango/src/myPrjApp/modelforms.py in __init__, line 399

第399行是我的表单中的“ forms.CheckboxSelectMultiple(choices = [(1,1)])”行。

如果我将字段从“ id”更改为“ name”,则表单不会给出此错误。我还有一些其他模型的主键不是'id'字段。我可以使用相应的主键删除这些模型项。但是,仅当主键为“ id”时,表单才会失败。

请帮助我纠正我的错误。

谢谢

1 个答案:

答案 0 :(得分:0)

模型中的id是不可编辑的,因此ModelForm不会为其创建字段。

无论如何,您这里不需要ModelForm。这是用于创建新实例或编辑现有实例。您只需要一个标准表格。

class deleteTryDjangoForm(forms.ModelForm):
    id = fields.MultipleChoiceField(
       choices=[(1,1)],
       widget=forms.CheckboxSelectMultiple
    )