3 votes

L'objet 'dict' n'a pas d'attribut 'create' / 'save'.

J'essaie d'appliquer l'application django poll à ma propre application (une calculatrice IMC) pour améliorer et construire un petit projet pour mes premiers pas en python/django.

J'essaie de sauvegarder les données de mon premier formulaire qui est sur accueil.html :

<form action="" method="post">
  <table>
    {{ form.as_table }}
  </table>

 <input type ="submit" value="Submit">
</form>

Voici mon forms.py :

from django import forms

class IndividuDataForm(forms.Form):
    nom = forms.CharField(max_length=100)
    prenom = forms.CharField(max_length= 100)
    anniversaire = forms.DateField()
    taille = forms.IntegerField()
    poids = forms.IntegerField()

Voici mon models.py :

from django.db import models

from django.forms import ModelForm

class Individu(models.Model):

    nom = models.CharField(max_length=100)
    prenom = models.CharField(max_length= 100)
    anniversaire = models.DateField()
    taille = models.IntegerField()
    poids = models.IntegerField()

    def __unicode__(self):

       return self.nom

class ImcResultat(models.Model):

    individu = models.ManyToManyField(Individu)

    imc = models.IntegerField()

    date_imc = models.DateField()

class IndividuForm(ModelForm):

    class Meta:

        model = Individu

class ImcResultatForm(ModelForm):

    class Meta:

        model = ImcResultat

Et enfin, mon * views.py * est ici : le problème se situe à la ligne 13 * a = cd.create() * lorsque j'essaie d'enregistrer les données du formulaire dans la base de données.

from django.shortcuts import render_to_response
from django.http import HttpResponse, HttpResponseRedirect
from models import Individu, ImcResultat
from forms import IndividuDataForm

def accueil(request):

    if request.method == 'POST':

        form = IndividuDataForm(request.POST)

        if form.is_valid():

            cd = form.cleaned_data

            a = cd.create() **#this is the problem**

            return HttpResponseRedirect('/accueil/page2/')

    else:

        form = IndividuDataForm()

        return render_to_response('accueil.html', {'form':form})

def page2(request):

    return render_to_response('page2.html')

Je pense que c'est sur la première partie du views.py que ma fonction ne fonctionne pas bien, elle n'enregistre pas le formulaire dans la base de données. def accueil(request) :

if request.method == 'POST':

    form = IndividuDataForm(request.POST)

    if form.is_valid():

        cd = form.cleaned_data

        a = cd.create() **#this is the problem**

        return HttpResponseRedirect('/accueil/page2/')

après avoir vérifié que le formulaire est valide, je nettoie les données dans le formulaire puis j'essaie de le sauvegarder. et j'ai obtenu cette erreur :

Exception Type: AttributeError 
Exception Value: 'dict' object has no attribute 'create'

Je suppose qu'il s'agit d'un dictionnaire, mais je n'ai jamais utilisé { } dans mon code pour une liste de dictionnaires. Je n'ai donc aucune idée et je suis bloqué dans le processus d'apprentissage.

Merci pour votre aide et j'espère que pour mon premier post stackoverflow je n'ai pas fait trop d'erreurs.

3voto

ryanday Points 1367

La réponse de Daniel est plus correcte

if form.is_valid():
    form.save()

Je laisse cependant ma réponse initiale, juste pour les liens de documentation.

Le formulaire.cleaned_data est un dictionnaire et ne possède pas la méthode create(). Je suppose que vous essayez de créer un modèle pour ces données dans votre base de données ?

Jetez un coup d'œil à Est-ce qu'un dictionnaire peut être passé aux modèles django lors de la création ? pour créer un modèle à partir de ce dictionnaire. Voici un exemple :

cd = form.cleaned_data
themodel = Individu(**cd)
themodel.save()

Vous trouverez ici la documentation relative au traitement des données du formulaire.

https://docs.djangoproject.com/en/dev/topics/forms/#processing-the-data-from-a-form

Bonne chance !

3voto

Daniel Roseman Points 199743

Vous devez utiliser un ModelForm, qui définira automatiquement les champs pour qu'ils correspondent à ceux du modèle. Vous pouvez ensuite appeler form.save() pour créer l'instance directement à partir du formulaire.

-2voto

alex Points 1219

Si vous voulez simplement que les données soumises soient sauvegardées comme un ModelForm de django, utilisez form.save().

voir : https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#s-the-save-method

Il utilisera déjà des données nettoyées/validées.

Vous pouvez utiliser form.cleaned_data si vous avez besoin de faire autre chose que de l'enregistrer avec une instance de modèle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X