Django-fr

Forum

#1 30-07-2014 21:43:20

ludicludo
Membre
Inscription : 30-07-2014
Messages : 3

insert au lieu de update

Bonjour à tous,
Fraichement débutant avec Django (2 semaines), je me suis décidé à m'inscrire sur le forum parce que je tourne chèvre sur un pb. Je m'explique.
Je dispose d'un modèle (Demande) auquel est associé une vue (DemandeView) pour la création des données dans la base, ça marche nickel.
Puis, je voudrais utiliser une seconde vue (patientDetailView) pour la mise à jour des données de la base (au cas où l'utilisateur se serait trompé par exemple). J'arrive à afficher la vue avec les champs pré-peuplés par les données de la base, mais l'envoie du formulaire me créer une nouvelle entrée dans la base de données au lieu de mettre les données à jour. Je tourne en rond...Est-ce que vous pourriez jeter un oeil sur les codes ci-dessous pour voir où ça cloche, svp ?
merci beaucoup.

La classe dans models.py

CHOICES = (('0', 'utile'),('1','très utile'))

class Demande(models.Model):
    nom = models.CharField(max_length=30)
    prenom = models.CharField(max_length=30)
    ipp = models.CharField(max_length=9, validators=[RegexValidator(regex='^(\d+){9}$',
                                                       message='9 chiffres',
                                                       code='match')], verbose_name = 'IPP')
    date = models.DateField(auto_now_add=True,verbose_name='date demande')
    medecin_demandeur = models.ForeignKey(Demandeur, verbose_name = 'demandeur')
    op = models.CharField(max_length = 100, verbose_name = 'dosimétriste')
    dateTEP = models.DateField(verbose_name='date TEP')
    dateTraitement = models.DateField(verbose_name='limite livraison')
    dateDerniereModification = models.DateTimeField(auto_now_add = True,
                                                    verbose_name='date dernières m-à-j.')
    commentaire = models.TextField(null=True, blank = True)
    qualification = models.CharField(choices = CHOICES,
                                     verbose_name = 'importance', default = '0', max_length = 1)
    pourcent = models.FloatField(default = 0, null = True, verbose_name = '% complet')
    
    def __unicode__(self):
        return smart_unicode(self.ipp)

dans view.py

@login_required(login_url='/login/')
def patientDetailView(request, id):
    detail = get_object_or_404(Demande, pk=id)
    print "id de detail:", detail.id
    dic_detail = {'id':detail.id, 'date':detail.date,
                                  'qualification': detail.qualification,
                                  'medecin_demandeur': detail.medecin_demandeur_id,
                                  'pourcent':detail.pourcent,
                                  'dateDerniereModification': detail.dateDerniereModification,
                                  'dateTEP':detail.dateTEP,
                                  'dateTraitement': detail.dateTraitement,
                                  'commentaire': detail.commentaire,
                                  'op':detail.op,
                                  'nom':detail.nom,
                                  'prenom':detail.prenom,
                                  'ipp':detail.ipp}

    
    if request.method == 'POST':
        form = DemandeForm(request.POST or None)

        if form.is_valid():
            save_it = form.save(commit = False)
            save_it.save()
            return HttpResponseRedirect(reverse('baseView'))
    else:
        form = DemandeForm(dic_detail, instance = detail)        
    return render_to_response('details.html',locals(),
                                  context_instance = RequestContext(request))

et le template :

{% extends 'base.html' %}
{% load bootstrap3 %}


{% block title %}
<h1 class="page-header">Patient: {{detail.commentaires}}</h1>
{% endblock %}

{% block content %}
    {#    <h2 class="sub-header"> {{detail.qualification}}</h2> #}
    <div class="col-xs-1 col-sm-1 placeholder"></div>
    <div class="col-xs-10 col-sm-10 placeholder">
        {# <h2 class="sub-header">Fusion TEP</h2> #}
        
        <form method='POST' action='' class="form-horizontal" role="form"> {% csrf_token %}
            {% bootstrap_form form %}
            {% buttons %}
                <input class="btn btn-primary btn-lg btn-block" type="submit">
            {% endbuttons %}
        </form>
    </div>
    <div class="col-xs-1 col-sm-1 placeholder"></div>
{% endblock%}

Hors ligne

#2 31-07-2014 09:20:46

Xavier Ordoquy
Administrateur
Lieu : Puteaux, France
Inscription : 12-10-2011
Messages : 312
Site Web

Re : insert au lieu de update

Bonjour,

D'une part, le mieux est de passer pas une UpdateView pour la mise à jour de modèles.
D'autre part, si tu ne fournis pas d'instance au formulaire, il considère qu'il s'agit d'une nouvelle instance et donc te créera une nouvelle entrée dans la base

Hors ligne

#3 31-07-2014 13:43:55

ludicludo
Membre
Inscription : 30-07-2014
Messages : 3

Re : insert au lieu de update

Bonjour,
Ok, noté pour l'updateview. Si j'ai bien compris,la doc officielle dit que c'est plus extensible d'utiliser les view-objets mais parfois un peu plus contraignant pour les trucs simples que les fonctions. De tout manière, vu l'état d'avancement de mon projet de test, autant tout reprendre avec les view-objets.
Toutefois, j'aimerais comprendre: il me semble avoir fourni une instance de mon objet au formulaire dans ma vue, non ?

form = DemandeForm(dic_detail, instance = detail)

ou alors je manque qquechose ?
merci

Hors ligne

#4 01-08-2014 16:04:02

Xavier Ordoquy
Administrateur
Lieu : Puteaux, France
Inscription : 12-10-2011
Messages : 312
Site Web

Re : insert au lieu de update

if request.method == 'POST':
        form = DemandeForm(request.POST or None)

Il n'y a plus d'instance ici. D'ailleurs, pourquoi instancier une nouvelle fois le formulaire ?

Hors ligne

#5 06-08-2014 09:59:48

EthPyth
Membre
Inscription : 22-08-2013
Messages : 7

Re : insert au lieu de update

Tel que ton def patientDetailView(request, id):
Tu dois faire une nouvelle class UpdateView comme la dit Xavier.
Tu peux également y attacher une class Form afin que ton formulaire d'update soit comme tu le souhaites en renseignant form_class = dans ta class UpdateView
-> https://docs.djangoproject.com/en/1.6/r … UpdateView
-> http://ccbv.co.uk/projects/Django/1.6/d … pdateView/

Hors ligne

#6 27-08-2014 16:15:16

ludicludo
Membre
Inscription : 30-07-2014
Messages : 3

Re : insert au lieu de update

Bonjour,
Super, ça marche nickel avec les classes.
merci.

Hors ligne

Pied de page des forums