Django-fr

Forum

  • Accueil
  • » Django-fr
  • » Probleme avec un form.save(), impossible de sauvegarder mon formulaire

#1 22-09-2015 14:43:22

Napoleon
Membre
Inscription : 27-08-2015
Messages : 16

Probleme avec un form.save(), impossible de sauvegarder mon formulaire

Bonjour smile !

Alors voila, j'ai commencé a travailler avec un certains schema pour ma base de données, mais maintenant j'aimerais modifier ma base de données afin de la rendre plus 'légère" disons.

Donc j'ai modifié mon model et mon formulaire, mais depuis je n'arrive plus du tout a sauvegarder mon formulaire dans ma base de données et je suis totalement perdu hmm !

Donc, si quelqu'un de meilleur/plus expérimenté que moi avait une idée de pourquoi mon travail ne marche pas, j'avoue que je serais plutôt intéréssé.

Voila mon code :

La view :

def proposal_create(request):
    """                                                                                                 
    Add a new proposal in the table Proposals                                                           
    Manage the webpage new_proposal                                                                     
    :var keywords: Permet de récupérer tout les mots-clefs existant pour pouvoir les afficher ensuite.  
    """

    keywords = Keywords.objects.all() # send the list of existing keywords                              

    if request.method == 'POST':

        if 'submit' in request.POST :

            form = ProposalForm(request.POST, request.FILES)

            if form.is_valid():

        proposal = form.save(commit=False)
                try:
                    name_bdd = User.objects.get(username = request.POST['pi_login'])
                    if name_bdd.firstName != request.POST['pi_first_name'] or name_bdd.lastName != request.POST['pi_last_name']:
                        raise
                except:
                    return render(request, 'new_user.html')

                try:
                    form.check_call(request)
                    form.check_co_pi_exist(request, proposal)
                    proposal.CALL = settings.AO_CALL
                    messages.warning(request, "0.0")
                    proposal.save()                                                #L'erreur vient de ce .save la !! / ! \
                    messages.warning(request, "0.1")
                    messages.info(request, "Proposal enregistré !")
                    proposal.user_link.add(name_bdd)
                    form.add_co_pi_bdd(request, proposal)
                    form.save_id_pi(proposal, request)
                except:
                    messages.warning(request, "Une erreur est survenue pendant l'enregistrement du Proposal")
            else:
                messages.error(request, "Le Formulaire que vous voulez soumettre n'est pas complet")

        elif 'save' in request.POST:

            form = ProposalFormSave(request.POST, request.FILES)
            if form.is_valid():

                MemoryProposal = form.save(commit=False)
                MemoryProposal.CALL = settings.AO_CALL
                MemoryProposal.save()
                messages.info(request, "Proposal sauvegardé !")

        elif 'reset' in request.POST :
            form = ProposalForm()

        elif 'add_member' in request.POST:
            return render(request, 'new_user.html')

    else:
        form = ProposalForm()

    return render(request, 'new_proposal.html', {'form': form})

mon formulaire:

class ProposalForm(forms.ModelForm):
    """                                                                                                 
    Form for submit a new proposal                                                                      
    """
    class Meta:
        model           = Proposal
        propKeys        = forms.ModelMultipleChoiceField(queryset=Keywords.objects.all())
        pi_first_name   = forms.CharField(max_length = 100)
        pi_last_name    = forms.CharField(max_length = 100)
        pi_login        = forms.CharField(max_length = 100)
        co_pi           = forms.CharField(max_length = 100)
        justification   = forms.FileField(label='select a file', help_text='max. 1 Mb')
        fields          = ['proposalID', 'title', 'category', 'abstract', 'propKeys', 'justification']

        error_messages = {
            'title': {
                'required': ("This champ is required"),
            },
        }

mon model:

class Proposal(models.Model):
    """                                                                                                 
    define Proposal table for "submit" Proposal                                                         
    """

    user_link = models.ManyToManyField('webportal.User')
    CALL = models.CharField(max_length = 100)

    # primary key for proposal table                                                                    
    proposalID = models.AutoField(primary_key=True)

    # fields for proposal table : Proposal Information                                                  
    title    = models.CharField(max_length = 100)
    category = models.CharField(max_length = 50, choices = CATEGORY)
    abstract = models.TextField(null=True)
    propKeys = models.ManyToManyField('Keywords', related_name="proposalKeys",
                                      blank=True)

    # fields for proposal table : Team                                                                  
    #pi_first_name    = models.CharField(max_length = 100)                                              
    #pi_last_name     = models.CharField(max_length = 100)                                              
    #pi_login         = models.CharField(max_length = 100)                                              
    #co_pi            = models.CharField(max_length = 100, blank=True)                                  
    pi_id    = models.IntegerField(blank=True)
    co_pi_id = models.CharField(max_length = 100, blank=True)

    # fields for proposal table : Target List                                                           
    #target_name = models.CharField(max_length = 100)                                                   
    #obs_type    = models.CharField(max_length = 100)                                                   

    # fields for proposal table : Scientific Justification                                              
    justification = models.FileField( upload_to = 'test_import', max_length=100, null=True, blank=True)

    def __str__(self):
        return self.title

De plus, quand la méthode .save() ne marche pas. N'y a t'il pas moyen de récupérer un message d'erreur nous donnant des précisions sur pourquoi le save na pas marché ?

Merci d'avance pour vos réponses ! smile

Hors ligne

#2 23-09-2015 07:44:31

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

Re : Probleme avec un form.save(), impossible de sauvegarder mon formulaire

Sans savoir exactement ce qu'il se passe (la vue passe et ton entrée n'est pas crée ? tu as un plantage ?) c'est mission impossible.

Hors ligne

#3 23-09-2015 09:39:34

Napoleon
Membre
Inscription : 27-08-2015
Messages : 16

Re : Probleme avec un form.save(), impossible de sauvegarder mon formulaire

Bonjour ! Excuse moi pour le manque d'info hmm

Donc:

C'est plutot quelque chose du genre la vue passe et aucunne enttrée n'est créer ( j'ai vérifié la structure de la base est correcte, c'est juste que ren ne se sauvegarde dedans).

C'est la méthode save() qui plante au moment de sauvegarder l'objet obtenu a partir de mon formulaire dans la bdd, mais je n'arrive vraiment pas a comprendre pourquoi, parceque form.save() et form_is_valid fonctionnent sans problemes. Dois-je en conclure que mon probleme est liée a mon modele plutot que a mon formulaire ? 

J'ai essayé de récupérer un éventuel messages d'erreur ce matin avec {{ form.errors }} dans mon template et en essayant aussi de l'afficher depuis ma view. Cependant aucun messages d'erreurs n'est apparu hmm
J'avoue que cela ne m'aide vraiment pas.

Je rajoute le code mon template qui rajoutera peut etre quelques infos:

{% extends "skeleton.html" %}
{% load staticfiles %}


{% block content %}

<div class="container">

  <div>
    <p>{{ form.errors }}</p>
    {{ form.errors }}
  </div>
    <form class="form-horizontal" action="{% url 'proposal:proposal.views.proposal_create' %}" method="\
post">
        {% csrf_token %}
        <fieldset>

            <div class="bs-example"> <!-- Tabs for separation of form -->

                <ul class="nav nav-tabs"> <!-- Name of Tabs -->
                  <li class="active"><a data-toggle="tab" href="#sectionA">Proposal Information</a></li\
>
                    <li><a data-toggle="tab" href="#sectionB">Team</a></li>
                    <li><a data-toggle="tab" href="#sectionC">Target List</a></li>
                    <li><a data-toggle="tab" href="#sectionD">Scientific Justification</a></li>
                </ul> <!-- Name of Tabs -->

                <div class="tab-content"> <!-- Content of Tabs -->

                    <div id="sectionA" class="tab-pane fade in active"> <!-- Content of tab Proposal In\
formation -->

                      <h3>Proposal Information</h3>
                      <!-- Text input for title field-->
                      <div class="form-group">
                        <label class="col-md-4 control-label" for="title">Title**</label>
                        <div class="col-md-6">
                          <input id="title" name="title" type="text"
                                 placeholder="Title of your proposal"
                                 class="form-control input-md">
                          {% for error in form.title.errors %}
                          {{ error }}
                          {% endfor %}
                        </div>
                      </div>

                        <!-- Select Basic for category field -->
                        <div class="form-group">
                            <label class="col-md-4 control-label" for="category">Category</label>
                            <div class="col-md-6">
                                <select id="category" name="category" class="form-control">
                                    <option value="category 1">Normal Proposal</option>
                                    <option value="category 2">Specific Proposal</option>
                                    <option value="category 3">High priority Proposal</option>
                                    <option value="category 3">Low priority Proposal</option>
                                </select>
                            </div>
                        </div>

                        <!-- Textarea for abstract-->
                        <div class="form-group">
                            <label class="col-md-4 control-label" for="abstract">Abstract*</label>
                            <div class="col-md-4">
                                <textarea class="form-control" id="abstract" name="abstract"
                                          placeholder="short presentation about the goal of your propos\
al"
                                          class="form-control input-md"></textarea>
                                {% for error in form.abstract.errors %}
                                {{ error }}
                                {% endfor %}

                            </div>
                        </div>
                        <!-- Select Multiple for keywords -->
                        <div class="form-group">
                            <label class="col-md-4 control-label" for="propKeys">Keywords</label>
                            <div class="col-md-6">
                                <select id="keywords" name="keywords" class="form-control"
                                        multiple="multiple">
                                    {% for keyword in keywords %}
                                    <option value={{keyword.id}}>{{keyword.keyword}}</option>
                                    {% endfor %}
                                </select>
                            </div>
                        </div>
                    </div><!-- Content of tab Proposal Information -->

                    <div id="sectionB" class="tab-pane fade"> <!-- Content of tab Team -->

                        <h3>Team</h3>
                        <!-- Text input for name of PI-->
                        <div class="form-group">
                          <!--<section id="Ca"-->
                          <div class="container">
                            <div class="panel panel-primary">
                              <div class="panel-heading">
                                <strong font-weight="bolder"><h4>PI Part:</h4></strong>
                              </div>
                            </div>
                          </div>
                            <label class="col-md-4 control-label" for="pi_first_name">PI_First_Name**</\
label>
                            <div class="col-md-6">
                                <input id="pi_first_name" name="pi_first_name" type="text"
                                       placeholder="Firstname of principal investigator(PI)"
                                       class="form-control input-md" required="">
                                {% for error in form.pi_first_name.errors %}
                                {{ error }}
                                {% endfor %}

                            </div>
                            <label class="col-md-4 control-label" for="pi_last_name">PI_Last_Name**</la\
bel>
                            <div class="col-md-6">
                                <input id="pi_last_name" name="pi_last_name" type="text"
                                       placeholder="Lastname of principal investigator(PI)"
                                       class="form-control input-md" required="">
                                {% for error in form.pi_last_name.errors %}
                                {{ error }}
                                {% endfor %}

                            </div>
                            <label class="col-md-4 control-label" for="pi_login">PI_login**</label>

                            <div class="col-md-6">
                              <input id="pi_login" name="pi_login" type="text"
                                     placeholder="Login/username of principal investigator(PI)"
                                     class="form-control input-md" required="">
                              {% for error in form.pi_login.errors %}
                              {{ error }}
                              {% endfor %}
                            </div>
                        </div>

                        <!-- Text input for name of co PI -->
                        <div class="container">
                          <div class="panel panel-primary">
                            <div class="panel-heading">
                              <strong font-weight="bolder"><h4>Co_PI Part:</h4></strong>
                            </div>
                          </div>
                        </div>
                        <div class="form_group">
                            <label class="col-md-4 control-label" for="co_pi">Co_PI</label>
                            <div class="col-md-6">
                                <input id="co_pi" name="co_pi" type="text"
                                       placeholder="Ex: Julia Chabazian, Will Smith, Philipe Aris"
                                       class="form-control input-md">
                                </br>
                           </div>
                        </div>  <!--Pas sur pour cette balise peut etre 1 de trop-->
                    </div> <!-- Content of tab Team -->

                    <div id="sectionC" class="tab-pane fade"> <!-- Content of tab Target List -->

                      <h3>Target List</h3>
                    </div> <!-- Content of tab Target List -->

                    <div id="sectionD" class="tab-pane fade"> <!-- Content of tab Scientific Justificat\
ion -->

                      <h3>Scientific Justification</h3>

                      <div class="form-group">
                        <label class="col-md-4 control-label" for="justification">Scientific Justificat\
ion</label>
                        <div class="col-md-6">
                          <input id="justification" name="justification" type="file">
                        </div>
                      </div>

                    </div> <!-- Content of tab Scientific Justification -->

                </div> <!-- Content of Tabs -->

            </div> <!-- Tabs for separation of form -->


            <div class="form-group">
                <label class="col-md-4 control-label" for="submit"></label>
                <div class="col-md-8">
                    <button id="submit" name="submit" class="btn btn-primary">
                      Submit</button>
                    <button id="save" name="save" class="btn btn-primary">
                      Save</button>
                    <button id="reset" name="reset" class="btn btn-warning">
                      Reset</button>
                </div>
            </div><!-- Button (Double) to save or reset the form-->

        </fieldset>
    </form><!-- Form of the proposal -->
    <div>
      <br>
      <p>* = Obligatory for 'submit' / ** = Obligatory for 'submit' and 'save'</p>
    </div>


    <form class="form-horizontal" action="{% url 'proposal:proposal.views.proposal_create' %}" method="\
post"><!--Form of add_member button-->
      {% csrf_token %}
      <div class="form-group">
        <label class="col-md-4 control-label" for="add_member"></label>
        <div class="col-md-8">
          <button method="post" href="{% url 'webportal:new_user' %}" id="add_member" name="add_member"\
 class="btn btn-success">add_member</button>
        </div>
      </div><!-- Button to add a new_member in bdd-->
    </form><!--Form of add_member button-->

</div> <!-- container -->

Dernière modification par Napoleon (23-09-2015 15:03:58)

Hors ligne

#4 23-09-2015 17:50:10

Napoleon
Membre
Inscription : 27-08-2015
Messages : 16

Re : Probleme avec un form.save(), impossible de sauvegarder mon formulaire

Bon, c'est dommage j'avais ecrit un beau message et tout, mais comme faut se log tout les 30s sur ce site il s'est perdu dans les lymbes... Bref

J'ai fini par trouver solution a mon probleme.

Voici mon code changé

try:
                    form.check_call(request)
                    form.check_co_pi_exist(request, proposal)
                    proposal.CALL = settings.AO_CALL
                    form.save_id_pi(proposal, request)
                    proposal.save()
                    messages.info(request, "Proposal enregistré !")
                    proposal.user_link.add(name_bdd)
                    form.add_co_pi_bdd(request, proposal)
                except:
                    messages.warning(request, "Une erreur est survenue pendant l'enregistrement du Propo\
sal")

Enfaite, je fait maintenant appel a la methode "save_id_pi" de mon formulaire avant le "proposal.save()".

Cependant, je ne suis pas sur de comprendre a 100% pourquoi cela marche maintenant. Alors, gentil admin (ou toute personne ayant une réponse d'ailleurs), si jamais tu pouvais éclairer un peu ma lanternne ca serait vraiment super ! smile

D'après moi, cela marche maintenant, car après avoir fait "proposal = form.save(commit=False)" mon objet proposal devait comporter les champs "pi_id" et "co_pi_id" de mon model et au moment de "proposal.save()" ces champs etait vide et donc la méthode .save() échouait.
Cependant d'une je ne suis pas sur que cela soit  vraiment ca, et de deux; si c'est cela, pourquoi mn objet proposal portait les champs "pi_id" et "co_pi_id" ? Ils ne sont pourtant pas renseignés dans la partie "fields=[...]" de mon formulaire et cela nee marchait pas plus quand je spécifiais ces champs dans la partie "exclude=[...]" de mon formulaire.

Est-ce parceque après "proposal = form.save(commit=False)" mon objet proposal hérite de tout les champs de mon model ? Si oui, j'ai pourtant précisé dans mon model "blank = True" pour les champs en question, donc pourquoi n'auraient-ils pas pu rester vides ?

Dans l'ensemble tout n'est as forcément très clair ( désolé si mon message et un peu brouillon, j'avais vraiment trop la flemme de tout bien réecrire une deuxieme fois), cependant toutes explications et la bienvenue !

Bonne soirée.

Hors ligne

  • Accueil
  • » Django-fr
  • » Probleme avec un form.save(), impossible de sauvegarder mon formulaire

Pied de page des forums