Django-fr

Forum

#1 11-05-2015 09:54:45

cobra85
Membre
Inscription : 11-05-2015
Messages : 58

Modifier la BDD via un formulaire

Bonjour,

Je développe sous Django et j'ai un problème pour réaliser un formulaire de modification de certaines données présentes dans la base.

Voici le code pour le formulaire:

models.py
class Formulaire(models.Model):
    depart=models.CharField(max_length=10)
views.py
def recherche(request):
    if request.method == 'POST':
        recherche_form = RechercheForm(request.POST)
  
        Reponse = request.POST.get('depart')
  
        Id= Ville.objects.get(ville=Reponse).id
  
        if recherche_form.is_valid():
            depart = recherche_form.cleaned_data['depart']
  
            resultat = Formulaire.objects.filter(depart_id=Id)
  
                #Affichage de la page "resultat_recherche"
            return render(request, 'blabla/resultat_recherche.html', {'resultat_recherche': resultat})
    else:
        recherche_form = RechercheForm()
  
    return render(request, 'blabla/recherche.html', {'recherche_form': recherche_form})

Voici le code que j'ai réalisé pour mon formulaire de modification, mais qui ne marche pas
   

from django.core.urlresolvers import reverse
 
def modifFormulaire(request,id):
 
    if request.method == 'POST':
        form = Formulaire(instance=Formulaire, data=request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse('blabla/offre'))
    else:
        form = Formulaire(instance=Formulaire)
    return render_to_response('blabla/modif_offre.html', {'form': form, })

Merci à vous

Hors ligne

#2 13-05-2015 07:47:56

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

Re : Modifier la BDD via un formulaire

Qu'est-ce qui ne marche pas ? Cela plante et fait un 500 ? la base n'est pas modifiée ? Ton formulaire n'est jamais valide ?

Hors ligne

#3 13-05-2015 09:13:38

cobra85
Membre
Inscription : 11-05-2015
Messages : 58

Re : Modifier la BDD via un formulaire

Bonjour,

Je m'aperçois que le formulaire indiqué n'était pas le bon, le voici:

def modifFormulaire(request,id):
    if request.method == 'POST':
        form = Formulaire(instance=Formulaire, data=request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse('offre'))
            return HttpResponseRedirect('blabla/offre')
    else:
        form = Formulaire()
    return render_to_response('blabla/modif_offre.html', {'form': form, })

Il est appelé via:

<td><a href="modif_offre/{{ formulaire.id }}">{{ ' modif' }}</a></td>
et 
    url(r'^modif_offre/(?P<id>[0-9]+)', views.modifFormulaire, name='modif_offre'),

Le message d'erreur que j'ai:

Reverse for 'modif_offre' with arguments '()' and keyword arguments '{}' not found. 1 pattern(s) tried: ['blabla/modif_offre/(?P<id>[0-9]+)']

Plus particulièrement sur la ligne: {% url "modif_offre" %}

modif_offre.html

{% extends "blabla/base.html" %}
<!--Block qui permet d'afficher le menu de la page -accueil--->

{% block content %}
<form action="{% url "modif_offre" %}" method="post">
    {% csrf_token %}
    {{ form.as_p  }}
    <input type="submit" value="Submit" />
</form>
{% endblock %}

Merci

voici le co

Hors ligne

#4 18-05-2015 20:52:02

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

Re : Modifier la BDD via un formulaire

il faut donner l'id avec le reverse, sinon ça ne marchera pas.

Hors ligne

#5 19-05-2015 12:34:49

cobra85
Membre
Inscription : 11-05-2015
Messages : 58

Re : Modifier la BDD via un formulaire

Merci,

Mais au risque de passer pour un nul, je ne comprend pas la réponse, en effet, normalement l'id est passé via cette ligne

<td><a href="modif_offre/{{ formulaire.id }}">{{ ' modif' }}</a></td>
et 
    url(r'^modif_offre/(?P<id>[0-9]+)', views.modifFormulaire, name='modif_offre'),

Vraiment désolé sad

merci

Hors ligne

#6 25-05-2015 21:40:37

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

Re : Modifier la BDD via un formulaire

il y a une confusion entre l'url qui est bien donnée ici et le reverse du HttpResponseRedirect qui lui pose souci.

Hors ligne

#7 28-05-2015 16:07:59

cobra85
Membre
Inscription : 11-05-2015
Messages : 58

Re : Modifier la BDD via un formulaire

Bonjour,

J'ai modifier légèrement mon code, mais j'ai toujours une/des erreurs, différentes cette fois ci:

voici mon code:

def modifFormulaire(request,id):
    question = Formulaire.objects.all().filter(id=id)
    if request.method == 'POST':
        form = FormulaireForm(instance=question, data=request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse('modif_offre.html'))
            #return HttpResponseRedirect('blabla/modif_offre.html')
    else:
        form = Formulaire()
    return render('blabla/modif_offre.html', {'form': form, })

Et voici les message d'erreur:

TemplateDoesNotExist at /blabla/modif_offre/36
{'form': <Formulaire: Formulaire object>}


Template-loader postmortem

Django tried loading these templates, in this order:

    Using loader django.template.loaders.filesystem.Loader:
        C:\Python27\Lib\site-packages\Django-1.8-py2.7.egg\django\bin\covoiturage\templates\{'form': <Formulaire: Formulaire object>} (File does not exist)
    Using loader django.template.loaders.app_directories.Loader:
        C:\Python27\lib\site-packages\django-1.8-py2.7.egg\django\contrib\admin\templates\{'form': <Formulaire: Formulaire object>} (File does not exist)
        C:\Python27\lib\site-packages\django-1.8-py2.7.egg\django\contrib\auth\templates\{'form': <Formulaire: Formulaire object>} (File does not exist)

Merci

Hors ligne

#8 28-05-2015 16:42:28

cobra85
Membre
Inscription : 11-05-2015
Messages : 58

Re : Modifier la BDD via un formulaire

L'erreur si dessus s'affiche si je commente les lignes suivantes dans models.py

def __unicode__(self):  # Python 3: def __str__(self):
        return str(self.depart)

Si celles-ci ne sont pas commentées, j'ai l'erreur suivante qui s'affiche:

RelatedObjectDoesNotExist at /blabla/modif_offre/36
Formulaire has no depart.

Hors ligne

#9 30-05-2015 12:36:12

cobra85
Membre
Inscription : 11-05-2015
Messages : 58

Re : Modifier la BDD via un formulaire

Salut,

J'ai un peu progressé, voici le code pour modifier le formulaire:

def modifFormulaire(request,id):

    if request.POST:
        book = Formulaire.objects.get(id=id)
        form = FormulaireForm(request.POST,instance = book)
        if form.is_valid():
            form.save()
            return redirect('/offre/')
    else:
        book = Formulaire.objects.get(id = id)
        form = FormulaireForm(instance = book)
        return render_to_response('blabla/modif_offre.html',{ 'form':form }, context_instance=RequestContext(request))

Celui-ci fonctionne, mais je n'arrive pas à afficher le formulaire sur ma page modif_offre.html. En effet, si je laisse:

<form action="{% url 'modif_offre' %}" method="post">
    {% csrf_token %}
    {{ form.as_p  }}
    <input type="submit" value="Submit" />
</form>

J'ai une erreur, cependant, si je rajoute, le numéro de l'id à modifier dans la première ligne:

<form action="{% url 'modif_offre' 36 %}" method="post">
    {% csrf_token %}
    {{ form.as_p  }}
    <input type="submit" value="Submit" />
</form>

La page de mon formulaire s'affiche normalement avec les valeurs dans les champs.

Mon souci est de pouvoir placer le numéro de l'ID dans la première ligne.

Dans le dossier urls.py, j'ai

url(r'^modif_offre/(?P<id>[0-9]+)', views.modifFormulaire, name='modif_offre'),

Si je mets:

<form action="{% url 'modif_offre' formulaire.id %}" method="post">

J'ai un message d'erreur

Merci

Hors ligne

#10 30-05-2015 15:02:19

cobra85
Membre
Inscription : 11-05-2015
Messages : 58

Re : Modifier la BDD via un formulaire

Salut,

Je progresse, j'ai trouver pour mon probleme d'ID, il fallait faire comme cela:

<form action="modif_offre/{{ form.id }}" method="post">

et pour ne pas avoir de souci lors de la validation du formulaire, il faut mettre:

return redirect('/blabla/offre/')

Hors ligne

#11 30-05-2015 22:17:02

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

Re : Modifier la BDD via un formulaire

Mieux vaut choisir la forme:

<form action="{% url 'modif_offre' formulaire.id %}" method="post">

mais étant donné ton dernier exemple, il faut que tu remplaces formulaire par form.

Hors ligne

#12 06-06-2015 13:01:55

cobra85
Membre
Inscription : 11-05-2015
Messages : 58

Re : Modifier la BDD via un formulaire

En faite, j'ai mis:

<form action="{{ form.id }}" method="post">

car si je mets:

<form action="{% url 'modif_offre' form.id %}" method="post">

j'ai un message d'erreur

Dernière modification par cobra85 (06-06-2015 13:02:14)

Hors ligne

Pied de page des forums