MultiValueDictKeyError - попытка выучить Django из видеоурока "wikicamp" - PullRequest
2 голосов
/ 18 ноября 2011

Я использовал эту доску, чтобы найти много ответов на свои проблемы, но для этой я не могу найти пост.Я уверен, что у меня просто должен быть какой-то плохой код.Я новичок в веб-разработке, поэтому я изучаю все это (HTTP, HTML, Python и Django одновременно, у меня более 20 лет опыта программирования, поэтому я его получаю).Я в какой-то момент в обучающем видео, многие из вас знают о том, где я размещаю новый контент без ошибок из html-кода редактирования, но может показаться, что строковые данные «контент» не передаются на следующий этап, на котором они будут полученысохраняется в базе данных.Пока что все ошибки, которые у меня были, связаны с тем, что тренинг был написан в очень старой версии, и я использую более новую версию.Однако я считаю, что это моя вина, поэтому мне нужна помощь.Я думаю, что в моем views.py я не передаю строку «content» правильно, или я не передаю ключ к записи базы данных, потому что ошибка, по-видимому, заключается в том, что в следующем разделе в представлении «save» первая строка выдает этоошибка, указывающая, что не удается найти строку данных, которую я пытался передать из последнего представления.ошибка ...

Request Method:     POST
Request URL:    http://127.0.0.1:7000/wikicamp/tony/save/
Django Version:     1.3.1
Exception Type:     MultiValueDictKeyError
Exception Value:    

"Key 'content' not found in <QueryDict: {u'csrfmiddlewaretoken': [u'a9be0ebf915fc40b13b016e791a153be']}>"

Трассировка назад

Environment:


Request Method: POST
Request URL: http://127.0.0.1:7000/wikicamp/tony/save/

Django Version: 1.3.1
Python Version: 2.7.2
Installed Applications:
['django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'wikicamp.wiki',
 'django.contrib.admin']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Trace back:

    File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response
      111.                         response = callback(request, *callback_args, **callback_kwargs)
    File "D:\web dev\training\Django\secondproj\wikicamp\..\wikicamp\wiki\views.py" in save_page
      30.   content = request.POST["content"] # error thrown for this line of code
    File "C:\Python27\lib\site-packages\django\utils\datastructures.py" in __getitem__
      256.             raise MultiValueDictKeyError("Key %r not found in %r" % (key, self))

    Exception Type: MultiValueDictKeyError at /wikicamp/tony/save/
    Exception Value: "Key 'content' not found in <QueryDict: {u'csrfmiddlewaretoken': [u'a9be0ebf915fc40b13b016e791a153be']}>"

просмотр кода

def view_page(request, page_name):
    try:
        page=Page.objects.get(pk=page_name)
    except Page.DoesNotExist:
        return render_to_response("create.html", {"page_name":page_name})
    content = page.content
    return render_to_response("view.html", {"page_name":page_name, "content":content})

def edit_page(request, page_name):
    try:
        page = Page.objects.get(pk=page_name)
        content = page.content
    except Page.DoesNotExist:
        content = ""
    return render_to_response("edit.html",{"page_name":page_name, "content":content},context_instance=RequestContext(request))

def save_page(request, page_name):

    content = request.POST["content"] # error thrown for this line of code
    try:
        page = Page.objects.get(pk=page_name)
        page.content = content
    except Page.DoesNotExist:
        page = Page(name=page_name, content = content, date = date)
        page = Page(name=page_name, content = content)
    page.save()
    return HttpResponseRedirect("/wikicamp/" + page_name +"/")

Ответы [ 3 ]

3 голосов
/ 18 ноября 2011

Имеет гораздо больше смысла с полной трассировкой, хотя я должен был увидеть это раньше только с вашим примером кода.

Ключ "content" существует только в request.POST после публикации страницы. Похоже, вы используете отдельное представление для POST, поэтому оно должно быть там. Тем не менее, вы никогда не захотите напрямую ссылаться на ключ в словаре, который не на 120% уверен, что находится там. Вместо этого используйте dict.get:

content = request.POST.get('content')

Это будет хранить None, если ключ не установлен. Вы также можете указать значение по умолчанию:

content = request.POST.get('content', 'this is the default')
0 голосов
/ 31 августа 2013

Ваш save_page вид может быть переписан так, чтобы избежать также и ошибки, которую вы получаете:

def save_page(request, page_name):

    Page.objects.get_or_create(name=page_name,
                               content = request.POST.get('content', ""))
    return HttpResponseRedirect("/wikicamp/" + page_name +"/")
0 голосов
/ 18 февраля 2012

Вам нужно изменить код следующим образом

    content = request.GET['content'] 

, и он должен работать.Я также использовал учебник и столкнулся с проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...