将数据从表单传输到模型时MultiValueDictKeyError

时间:2014-10-15 20:31:23

标签: python django forms post

我的模特:

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 “ '文本'”

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

2 个答案:

答案 0 :(得分:3)

我可以看到你可能想要做的两件事。

如果note应该是您创建的MyNote实例的内容,那么您的核心问题是该字段有两个不同的名称 - text用于模型和{ {1}}表单。您应该使名称一致,并使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) 会导致Django在第一次插入时将字段设置为当前时间。

auto_add_now

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

答案 1 :(得分:1)

另一个答案涵盖了我写的大部分内容,所以我只是添加一个异常本身的解释。

由于MultiDictKeyError未在text中找到request.POST,因此提出了{p> request.POST.get('text', '')。一般的解决方法是使用例如dict.get()。参数是&#34; key&#34;和&#34;默认,&#34;与标准text方法一样。这样,如果找不到密钥,则会有一个回退值,并且不会引发异常。但正如已经指出的那样,更大的问题是{{1}}不是表格字段。