我的模特:
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 “ '文本'”
我是否正确地将数据传输到模型?
答案 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}}不是表格字段。