【问题标题】:MultiValueDictKeyError when you transmit data from the form to the model将数据从表单传输到模型时出现 MultiValueDictKeyError
【发布时间】:2014-12-11 01:30:25
【问题描述】:

我的模特:

class MyNote(models.Model):
    text = models.CharField(max_length=140)
    pub_date = models.DateTimeField('date published')

我的表格:

class Note(forms.Form):
    note = forms.CharField(label="Wpisz notatke", max_length=255)

我的看法:

def note(request):
    if request.method == 'POST':
        form = Note(request.POST)

        if form.is_valid():
            post = MyNote.objects.create(text=request.POST['text'], pub_date=datetime.utcnow())
            return HttpResponseRedirect(reverse('todoapps:index', kwargs={'post': post.id}))

    else:
        form = Note()

    return render(request, 'note.html', {'form': form})

我的网址:

urlpatterns = patterns('',
    url(r'^$', views.index, name='index'),
    url(r'^(?P<id>\d+)/$', views.details, name='detail'),
    url(r'^note/$', views.note, name="note"),
)

我想编写表格中引入的模型并显示它们。

我得到:/todo/note/ 处的 MultiValueDictKeyError “‘文本’”

我是否正确地将数据传输到模型?

【问题讨论】:

    标签: python django forms post


    【解决方案1】:

    另一个答案涵盖了我所写的大部分内容,因此我将在其中添加对异常本身的解释。

    MultiDictKeyError 正在引发,因为在 request.POST 中找不到 text 作为键。一般的解决方法是使用例如request.POST.get('text', '')。与标准dict.get() 方法一样,参数是“key”和“default”。这样,如果找不到密钥,就会有一个备用值,并且不会引发异常。但正如已经指出的,更大的问题是text 不是表单字段。

    【讨论】:

      【解决方案2】:

      我可以看到您可能会在这里尝试做的两件事。

      如果note 应该是您创建的MyNote 实例的内容,那么您的核心问题是该字段有两个不同的名称——text 用于模型,note 用于表单。您应该使名称一致,并使max_length 值相同。

      如果note 是补充,您需要确保在某处有text 输入。最自然的地方是表单类。你实际上也没有对note 做任何事情,但我猜不出你可能想用它做什么。

      无论哪种方式,从request.POST 实例化一个表单,验证它,然后不再使用它并通过键引用request.POST 是不寻常的。更常见的是,你会使用form.cleaned_data['text'] 或其他东西,或者使用ModelForm,如果有效就保存它。我会把整个事情改成这样:

      class MyNote(models.Model):
          text = models.CharField(max_length=140)
          pub_date = models.DateTimeField('date published', auto_add_now=True)
      

      auto_add_now 使 Django 在您第一次插入时将字段设置为当前时间。

      class NoteForm(forms.ModelForm):
          class Meta:
              model = MyNote
              fields = ('text',)
      
      def note(request):
          if request.method == 'POST':
              form = NoteForm(request.POST)
              if form.is_valid():
                  post = form.save()
                  return HttpResponseRedirect(reverse('todoapps:index', kwargs={'post': post.id}))
          else:
              form = Note()
          return render(request, 'note.html', {'form': form})
      

      或者使用通用的CreateView,它们封装了这种逻辑。

      【讨论】:

        猜你喜欢
        • 2016-01-17
        • 2021-06-15
        • 2020-12-12
        • 1970-01-01
        • 1970-01-01
        • 2014-03-06
        • 1970-01-01
        • 2018-01-02
        • 1970-01-01
        相关资源
        最近更新 更多