Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

mise a jour django

5 réponses
Avatar
hervest
Bonjour,
je reviens encore aujourd'hui avec des questions sur django. Je suis en train de faire une page de mise à jour des informations d'une personne qui existe déjà dans ma base.

Models.py
class Personne:
nom=models.CharField(max_length=45)
adr_emp=models.CharField(max_length=255)
tel_emp=models.CharField(max_length=20)
email=models.EmailField(unique=True)

voici comment j'ai procédé avec le controleur

def personne_modif(request, idp): #idp identifiant de la personne vennant d'une autre page
formSet = modelformset_factory(Personne, max_num=1)
if request.method == 'POST':
formset = formSet(request.POST)
if formset.is_valid():
formset.save()
return HttpResponseRedirect('/fiche/')
else:
fmset = formSet(queryset=Personne.objects.filter(id=int(idsr)))
return render_to_response('Personne_modif.html',{'form':fmset})

la mise à jour ne s'execute pas et j'ai les erreurs suivantes:

id existe déjà
matricule existe déjà

au lieu de faire la mise à jour, il veut créer une autre personne dans la base. Comment je dois faire pour faire une mise à jour des données avec django

5 réponses

Avatar
hervest
hervest a écrit le 31/01/2009 à 19h10 :
Bonjour,
je reviens encore aujourd'hui avec des questions sur django. Je suis en train
de faire une page de mise à jour des informations d'une personne qui
existe déjà dans ma base.

Models.py
class Personne:
nom=models.CharField(max_lengthE)
adr_emp=models.CharField(max_length%5)
tel_emp=models.CharField(max_length )
email=models.EmailField(unique=True)

voici comment j'ai procédé avec le controleur

def personne_modif(request, idp): #idp identifiant de la personne vennant
d'une autre page
formSet = modelformset_factory(Personne, max_num=1)
if request.method == 'POST':
formset = formSet(request.POST)
if formset.is_valid():
formset.save()
return HttpResponseRedirect('/fiche/')
else:
fmset = formSet(queryset=Personne.objects.filter(id=int(idsr)))
return render_to_response('Personne_modif.html',{'form':fmset})

la mise à jour ne s'execute pas et j'ai les erreurs suivantes:

id existe déjà
matricule existe déjà

au lieu de faire la mise à jour, il veut créer une autre personne
dans la base. Comment je dois faire pour faire une mise à jour des
données avec django


personne pour me répondre?
Avatar
Bruno Desthuilliers
hervest a écrit :
Bonjour,
je reviens encore aujourd'hui avec des questions sur django. Je suis en train
de faire une page de mise à jour des informations d'une personne qui existe déjà
dans ma base.

Models.py
class Personne:
nom=models.CharField(max_lengthE)
adr_emp=models.CharField(max_length%5)
tel_emp=models.CharField(max_length )
email=models.EmailField(unique=True)

voici comment j'ai procédé avec le controleur

def personne_modif(request, idp): #idp identifiant de la personne vennant
d'une autre page
formSet = modelformset_factory(Personne, max_num=1)



Pourquoi un formset ???

Extrait de la doc:
"""
A formset is a layer of abstraction to working with multiple forms on
the same page.
"""

Ici, tu ne veux bosser que sur une instance à la fois. Donc, suivre les
instructions données ici:
http://docs.djangoproject.com/en/dev/topics/forms/modelforms/


if request.method == 'POST':
formset = formSet(request.POST)
if formset.is_valid():
formset.save()
return HttpResponseRedirect('/fiche/')



Utilise de préférence soit la merthode get_absolute_url de l'instance
(si tu l'a définie dans ton modèle), soit
django.core.urlresolvers.reverse (avec bien sûr des urls nommées dans
tes urls.py).

else:
fmset = formSet(queryset=Personne.objects.filter(id=int(idsr)))
return render_to_response('Personne_modif.html',{'form':fmset})

la mise à jour ne s'execute pas et j'ai les erreurs suivantes:

id existe déjà
matricule existe déjà


>
au lieu de faire la mise à jour, il veut créer une autre personne dans la base.



Les éléments du formset n'étant liés à aucune instance, c'est le
comportement attendu. Il faudrait que tu lie le formset à un queryset
lors de l'instanciation. Mais bon, puisque tu n'édite qu'une instance,
cf plus haut.

Comment je dois faire pour faire une mise à jour des données avec django



Comme indiqué dans la doc : en liant le ModelFormset à un queryset, ou
le ModelForm à une instance du modèle correspondant.

HTH
Avatar
hervest
Bruno Desthuilliers a écrit le 03/02/2009 à 17h07 :
hervest a écrit :
Bonjour,
je reviens encore aujourd'hui avec des questions sur django. Je suis en train
de faire une page de mise à jour des informations d'une personne qui
existe déjà
dans ma base.

Models.py
class Personne:
nom=models.CharField(max_lengthE)
adr_emp=models.CharField(max_length%5)
tel_emp=models.CharField(max_length )
email=models.EmailField(unique=True)

voici comment j'ai procédé avec le controleur

def personne_modif(request, idp): #idp identifiant de la personne vennant
d'une autre page
formSet = modelformset_factory(Personne, max_num=1)




Pourquoi un formset ???

Extrait de la doc:
"""
A formset is a layer of abstraction to working with multiple forms on
the same page.
"""

Ici, tu ne veux bosser que sur une instance à la fois. Donc, suivre les
instructions données ici:
http://docs.djangoproject.com/en/dev/topics/forms/modelforms/


if request.method == 'POST':
formset = formSet(request.POST)
if formset.is_valid():
formset.save()
return HttpResponseRedirect('/fiche/')




Utilise de préférence soit la merthode get_absolute_url de
l'instance
(si tu l'a définie dans ton modèle), soit
django.core.urlresolvers.reverse (avec bien sûr des urls nommées
dans
tes urls.py).

else:
fmset = formSet(queryset=Personne.objects.filter(id=int(idsr)))
return render_to_response('Personne_modif.html',{'form':fmset})

la mise à jour ne s'execute pas et j'ai les erreurs suivantes:

id existe déjà
matricule existe déjà



>
au lieu de faire la mise à jour, il veut créer une autre
personne dans la base.




Les éléments du formset n'étant liés à
aucune instance, c'est le
comportement attendu. Il faudrait que tu lie le formset à un queryset
lors de l'instanciation. Mais bon, puisque tu n'édite qu'une instance,
cf plus haut.

Comment je dois faire pour faire une mise à jour des données
avec django




Comme indiqué dans la doc : en liant le ModelFormset à un
queryset, ou
le ModelForm à une instance du modèle correspondant.

HTH


bonjour,
merci, j'ai relu la page attentivement et j'ai trouvé ceci

http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#using-a-custom-queryset

vous avez raison je n'avais pas lié modelformset a un queryset j'ai ajouté ceci et ça marche

if request.method == 'POST':
formset = formSet(request.POST, queryset=Personne.objects.filter(id=int(idsr))
if formset.is_valid():
formset.save()
return HttpResponseRedirect('/fiche/')

est ce que c'est ça que vous entendez par lier?

si j'utilise la methode get_absolute_url, certes je pourrais afficher mais si l'on doit modifier les données pour une mise à jour, est ce qu'après validation du formulaire. je n'aurais pas le même problème c'est à dire qu'il va vouloir faire une insertion et non une mise à jour? C'est à ça que j'ai pensé et je me suis tourné vers les formset
Avatar
Bruno Desthuilliers
hervest a écrit :
(snip)
bonjour,
merci, j'ai relu la page attentivement et j'ai trouvé ceci

http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#using-a-custom-queryset

vous avez raison je n'avais pas lié modelformset a un queryset j'ai ajouté ceci
et ça marche

if request.method == 'POST':
formset = formSet(request.POST, queryset=Personne.objects.filter(id=int(idsr))
if formset.is_valid():
formset.save()
return HttpResponseRedirect('/fiche/')

est ce que c'est ça que vous entendez par lier?



Oui.

Ceci étant, il n'en reste pas moins qu'utiliser un ModelForm*Set* pour
une seule instance est un WTF. Il faudrait ici utiliser un ModelForm.

si j'utilise la methode get_absolute_url, certes je pourrais afficher mais si
l'on doit modifier les données pour une mise à jour,



???

Désolé, je ne vois pas le rapport entre le fait d'éviter de coder des
urls en dur et la gestion des formulaires ?

est ce qu'après validation
du formulaire. je n'aurais pas le même problème c'est à dire qu'il va vouloir
faire une insertion et non une mise à jour? C'est à ça que j'ai pensé et je me
suis tourné vers les formset



Pour les ModelForm comme pour les ModelFormSet, le fait d'insérer ou de
mettre à jour est conditionné par le fait de lier ou non le form (resp.
formset) à une instance (resp. un queryset). Il y a donc deux façons de
gérer cette distinction:

1/ avoir deux views differentes (une pour les creations, une pour les
modifs) - ce qui est _généralement_ une redondance inutile, en tous cas
pour les cas simples

2/ avoir deux *urls* différentes ('/monmodel/add/' et
'/monmodel/<id>/edit/' par exemple) pointant sur la même view, l'id
étant par défaut à None, ce qui permet de distinguer clairement les deux
cas. On a alors quelque chose comme:

from monapp.models import MonModel
from monapp.forms import MonModelForm

def monmodel_add_or_edit(request, id=None):
if id is not None:
# mise a jour
instance = get_object_or_404(MonModel, id)
else:
# creation
instance = None

if request.POST:
form = MonModelForm(request.POST, instance=instance)
if form.is_valid():
form.save()
return HttpResponseRedirect(instance.get_absolute_url())

else:
form = MonModelForm(instance=instance)

return render_to_response(
"monapp/montemplate.html",
dict(form=form),
context_instance=RequestContext(request)
)
Avatar
hervest
Bruno Desthuilliers a écrit le 04/02/2009 à 15h31 :
hervest a écrit :
(snip)
bonjour,
merci, j'ai relu la page attentivement et j'ai trouvé ceci

http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#using-a-custom-queryset

vous avez raison je n'avais pas lié modelformset a un queryset j'ai
ajouté ceci
et ça marche

if request.method == 'POST':
formset = formSet(request.POST, queryset=Personne.objects.filter(id=int(idsr))
if formset.is_valid():
formset.save()
return HttpResponseRedirect('/fiche/')

est ce que c'est ça que vous entendez par lier?




Oui.

Ceci étant, il n'en reste pas moins qu'utiliser un ModelForm*Set* pour
une seule instance est un WTF. Il faudrait ici utiliser un ModelForm.

si j'utilise la methode get_absolute_url, certes je pourrais afficher mais si
l'on doit modifier les données pour une mise à jour,




???

Désolé, je ne vois pas le rapport entre le fait d'éviter
de coder des
urls en dur et la gestion des formulaires ?

est ce qu'après validation
du formulaire. je n'aurais pas le même problème c'est à
dire qu'il va vouloir
faire une insertion et non une mise à jour? C'est à ça
que j'ai pensé et je me
suis tourné vers les formset




Pour les ModelForm comme pour les ModelFormSet, le fait d'insérer ou de
mettre à jour est conditionné par le fait de lier ou non le form
(resp.
formset) à une instance (resp. un queryset). Il y a donc deux
façons de
gérer cette distinction:

1/ avoir deux views differentes (une pour les creations, une pour les
modifs) - ce qui est _généralement_ une redondance inutile, en
tous cas
pour les cas simples

2/ avoir deux *urls* différentes ('/monmodel/add/' et
'/monmodel/<id>/edit/' par exemple) pointant sur la même view, l'id
étant par défaut à None, ce qui permet de distinguer
clairement les deux
cas. On a alors quelque chose comme:

from monapp.models import MonModel
from monapp.forms import MonModelForm

def monmodel_add_or_edit(request, id=None):
if id is not None:
# mise a jour
instance = get_object_or_404(MonModel, id)
else:
# creation
instance = None

if request.POST:
form = MonModelForm(request.POST, instance=instance)
if form.is_valid():
form.save()
return HttpResponseRedirect(instance.get_absolute_url())

else:
form = MonModelForm(instance=instance)

return render_to_response(
"monapp/montemplate.html",
dict(form=form),
context_instance=RequestContext(request)
)


Merci