J'ai utilisé ce forum pour trouver de nombreuses réponses à mes problèmes, mais pour celui-ci, je ne trouve pas de message. Je suis certain que je dois juste avoir un mauvais code. Je suis nouveau dans le développement web donc j'apprends tout cela (HTTP, HTML, Python et Django à la fois, j'ai plus de 20 ans d'expérience en programmation donc je comprends). Je suis à un moment de la vidéo de formation, beaucoup d'entre vous savent où je POSTE le nouveau contenu sans erreur du HTML d'édition, mais il semblerait que le "contenu" des données de chaîne ne soit pas transmis à l'étape suivante où il serait enregistré dans la base de données. Jusqu'à présent, toutes les erreurs que j'ai eues sont liées au fait que la formation a été écrite dans une très ancienne version et j'utilise une version plus récente. Celui-ci, cependant, je pense que c'est ma faute, j'ai donc besoin d'aide. Je pense que dans mon views.py, je ne passe pas correctement la chaîne "content" ou je ne passe pas la clé à l'entrée de la base de données car l'erreur semble être que dans la section suivante, la vue "save" la première ligne lance ceci erreur indiquant qu'il ne peut pas trouver la chaîne de données que j'essayais de passer de la dernière vue. l'erreur est ...

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']}>"

Trace Back

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']}>"

Voir le code

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 +"/")
2
user1054210 18 nov. 2011 à 21:59

3 réponses

Meilleure réponse

Cela a beaucoup plus de sens avec une trace complète, bien que j'aurais dû le voir auparavant juste avec votre exemple de code.

La clé "contenu" n'existe que dans request.POST après la publication de la page. Il semble que vous utilisiez une vue distincte pour le POST, donc il devrait y être. Néanmoins, vous ne voulez jamais référencer directement une clé dans un dictionnaire dont vous n'êtes pas sûr à 120%. Utilisez plutôt dict.get:

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

Cela stockera None si la clé n'est pas définie. Vous pouvez également spécifier une valeur par défaut:

content = request.POST.get('content', 'this is the default')
3
Chris Pratt 18 nov. 2011 à 19:51

Vous devez modifier le code comme ceci

    content = request.GET['content'] 

Et ça devrait marcher. J'ai également utilisé le didacticiel et rencontré le problème.

0
Tariq Mehmood 18 févr. 2012 à 13:38

Votre vue save_page peut être réécrite comme ceci, ce qui évitera également l'erreur que vous obtenez:

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
Burhan Khalid 31 août 2013 à 08:17