IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Django Python Discussion :

Formulaire et variable POST


Sujet :

Django Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 263
    Par défaut Formulaire et variable POST
    Bonjour a tous, sur une de mes pages, j'ai plusieurs formulaires, mais j'ai constater que si une des variables POST étais vide je recevais un message d'erreurs dans ce genre la :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Exception Type:      MultiValueDictKeyError
    Exception Value:     
     
    "Key 'id_album' not found in <QueryDict: {u'csrfmiddlewaretoken': [u'4ebc1bff327889fa70fb3ec58cd35dfd'], u'del': [u'69'], u'favo': [u'a'], u'delete': [u'']}>"
    Donc si j'ai bien compris toute les variables POST doivent avoir une valeur par défaut dans les différents formulaire, pour que Django ne considère pas la variable comme inexistante.


    J'ai essayer en mettant une valeur par défaut aux différentes variables POST, mais cette fois-ci je reçois un autres message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Exception Type:      DoesNotExist
    Exception Value:     
     
    Collection matching query does not exist.

    je vous met mes formulaires :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    <table class="tabResultAlbum" cellpadding="2" cellspacing="5" >
    		{% for list in  list_album %}
    		<tr>
     
    			{% ifequal list.is_favourite 1 %}
    			<form name="on" action="{% url libertyproject.imagin.views.view_album %}" method="post">
    				{% csrf_token %}
    				<td style="width: 5%"><input class="onAlbum" name="Album" type="submit" value="" /></td>
     
    				<input type="hidden" name="id_album" value="{{list.id}}">
    				<input type="hidden" name="favo" value="{{list.is_favourite}}">
     
    				<!-- Champ par defaut -->
    				<input type="hidden" name="del" value="0">
     
    			</form>
     
    			{% else %}
     
    			<form name="off" action="{% url libertyproject.imagin.views.view_album %}" method="post">
    				{% csrf_token %}
    				<td style="width: 5%"><input class="offAlbum" name="Album" type="submit" value="" /></td>
     
    				<input type="hidden" name="id_album" value="{{list.id}}">
    				<input type="hidden" name="favo" value="{{list.is_favourite}}">
     
    				<!-- Champ par defaut -->
    				<input type="hidden" name="del" value="0">
     
    			</form>
    			{% endifequal %}
     
    			<form name="del" action="{% url libertyproject.imagin.views.view_album %}" method="post">
    				{% csrf_token %}
    			<td style="width: 120px"><input onclick="if(verif()) return true; else return false;" class="delAlbum" name="delete" type="submit" value="" /></td>
     
    			<input type="hidden" name="del" value="{{list.id}}">
     
    			<!-- Champ par defaut -->
    			<input type="hidden" name="favo" value="a">
    			<input type="hidden" name="id_album" value="{{list.id}}">
    			</form>
    		</tr>
    		{% endfor %}
     
    	</table>

    Mon traitement dans ma views :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    def view_album(request):
        if len(request.POST) > 0:
            if request.POST['del'] != '':
                id_album = request.POST['del']
                delete_album = Collection.objects.get(pk=id_album)
                delete_album.delete()
     
            if request.POST['favo'] != False: 
                id_album = request.POST['id_album']
                chang_fav_off = Collection.objects.get(pk=id_album)
                chang_fav_off.is_favourite = False
                chang_fav_off.save()
            elif request.POST['favo'] != True: 
                id_album = request.POST['id_album']
                chang_fav_on = Collection.objects.get(pk=id_album)
                chang_fav_on.is_favourite = True
                chang_fav_on.save()

    Pour infos :

    POST['del'] renvoi un id.

    POST['id_album'] renvoi un id.

    request.POST['favo'] renvoi un booléen.


    Merci d'avance pour votre aide, c'est mon premier cas avec plusieurs variables POST avec plusieurs formulaire, je me perds....

  2. #2
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Bonjour,

    le mieux pour récuperer une valeur dans un QueryDict est d' utiliser la methode get:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    id_album = request.POST.get('id_album', None)
    if id_album:
         ...

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 263
    Par défaut
    Merci mais je crois que j'ai pas compris tous le principe....


    J'ai toujours ce message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Exception Type:      DoesNotExist
    Exception Value:     
     
    Collection matching query does not exist.
    Mon views :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    def view_album(request):
        if len(request.POST) > 0:
            id_album = request.POST.get('id_album', None)
            favo = request.POST.get('favo', None)
            id_delete_album = request.POST.get('del', None)
     
            if id_album:
                delete_album = Collection.objects.get(pk=id_delete_album)
                delete_album.delete()
     
            if favo != False: 
     
                chang_fav_off = Collection.objects.get(pk=id_album)
                chang_fav_off.is_favourite = False
                chang_fav_off.save()
            elif favo != True: 
     
                chang_fav_on = Collection.objects.get(pk=id_album)
                chang_fav_on.is_favourite = True
                chang_fav_on.save()

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Par défaut
    Salut,
    le mieux serait d’utiliser les formulaires de Django

    Donc, tu aurais un formulaire du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # -*- coding: utf-8 -*-
    from django import forms
     
    class ContactForm(forms.Form):
        sujet = forms.CharField(max_length = 100, min_length = 5) #Mettre des tailles maximale et minimale.
        email = forms.EmailField(required = False, label = 'Votre adresse e-mail') #Champ facultatif. Modification de l'étiquette.
        message = forms.CharField(widget = forms.Textarea) #Modifier le widget par défaut.
    Ensuite, tu pourrais faire une vue comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    def contact(request):
        if request.method == 'POST': #Si les données sont envoyés par la méthode post.
            form = ContactForm(request.POST) #Récupérer les données du formulaire
     
            if form.is_valid(): #Si les données sont valides.
                donnees = form.cleaned_data
     
                send_mail(
                    donnees['sujet'],
                    donnees['message'],
                    donnees.get('email', 'noreply@example.com'),
                    ['example@gmail.com']
                )
                return HttpResponseRedirect('/contact/merci/')
        else:
            form = ContactForm(initial = {'sujet': 'J\'adore votre site !'}) #Créer un formulaire avec une valeur initiale pour l’affichage.
        return render_to_response('contact/contact.tpl', {'form': form}, context_instance = RequestContext(request))
    Avec cette façon, il est beaucoup plus facile de gérer ses formulaires.

    Bonne lecture.

    À plus !

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 263
    Par défaut
    Merci pour vos réponses !

    J'utiliserai a l'avenir le formulaire Django.


    Mon souci venais que quand il me mettais une valeur par défaut et que je comparais a un booléen il n'aimais pas et sa plantais...





    Encore merci !!!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AJAX] Envoyer variable POST via Formulaire
    Par lounou dans le forum jQuery
    Réponses: 8
    Dernier message: 23/07/2013, 08h54
  2. [Flex3] Récupérer une variable post envoyer par un formulaire html
    Par naoufel1986 dans le forum Flex
    Réponses: 1
    Dernier message: 20/08/2010, 21h52
  3. Réponses: 2
    Dernier message: 01/11/2009, 19h56
  4. Passage de variables POST sans formulaire
    Par seb92400 dans le forum Langage
    Réponses: 8
    Dernier message: 29/04/2009, 11h04
  5. Formulaire auto submit post variables
    Par djanke dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 28/08/2007, 22h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo