Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Django] Implémentation dans la base Sqlite3

Sujet résolu
    7 mai 2022 à 8:57:30

    Bonjour, 

    J'essaye de créé un formulaire pour créé des évènements, cependant, quand je transmet les infos à ma base, la page ne créée pas d'erreur, mais rien ne se passe. 

    View.py
    
    def new_event(request):
        if request.method == "POST":
            form = CreatForm(request.POST)
            if form.is_valid():
                post = form.save(commit=False)
                post.user = Evenement.objects.get(user=request.user)
                post.save()
                return redirect('blog')
        else:
            form = CreatForm()     
        return render(request, 'blog/evenement_creation.html', context={
                                                               "form" : form,
                                                               })
    form.py
    
    from django import forms
    
    class CreatForm(forms.Form):
        title = forms.CharField(
            label='Titre',
            max_length=55,
            widget=forms.TextInput(attrs={'class': 'form-control'}),
            required = True
        )
        
        sous_titre = forms.CharField(
            label='Sous titre',
            max_length=55,
            widget=forms.TextInput(attrs={'class': 'form-control'}),
            required = True
        )
    
        lieu = forms.CharField(
            label='Lieu',
            max_length=128,
            widget=forms.TextInput(attrs={'class': 'form-control'}),
            required = True
        )
    
        description = forms.CharField(
            label='Description',
            widget=forms.Textarea(attrs={'class': 'form-control'}),
            required = True
        )
        
        thumbnail = forms.ImageField(
            label='Image primaire',
            required = True
        )
        
        images_article = forms.ImageField(
            label='Image de l article',
            required = False
        )
        
    formulaire html
    
      <form method="POST" >
                    {% csrf_token %}
    
                    <fieldset>
                   
                    <div class="form-group">
                        <label for="{{ form.title.id_for_label }}" class="form-label mt-4">Titre de l'évènement</label>
                        {{ form.title }}
                    </div>
    
                    <div class="form-group">
                        <label for="{{ form.sous_titre.id_for_label }}" class="form-label mt-4">Sous titre de l'évènement</label>
                        {{ form.sous_titre }}
                    </div>
    
                    <div class="form-group">
                        <label for="{{ form.lieu.id_for_label }}" class="form-label mt-4">Lieu de l'évènement</label>
                        {{ form.lieu }}
                    </div>
    
                    <div class="form-group">
                        <label for="{{ form.description.id_for_label }}" class="form-label mt-4">Description de l'évènement</label>
                        {{ form.description }}
                    </div>
    
    
                    <div class="form-group">
                        <label for="{{ form.thumbnail.id_for_label }}" class="form-label mt-4">Image principale</label>
                        {{ form.thumbnail }}
                    </div>
    
                    <div class="form-group">
                        <label for="{{ form.images_article.id_for_label }}" class="form-label mt-4">Image de l'article</label>
                        {{ form.images_article }}
                    </div>
    
                    </fieldset>
                        <button type="submit" class="btn btn-primary">Submit</button> 
                </form> 

    Et j'ai bien les infos dans mon toolbar :

    capture

    Si vous avez la solution je suis preneur ^^ 

    Cordialement

    • Partager sur Facebook
    • Partager sur Twitter
      7 mai 2022 à 11:43:35

      Quand tu dis "rien ne se passe", tu t'attendais à quoi comme résultat ?

      Pourquoi l'utilisateur d'un post est un événement ?

      post.user = Evenement.objects.get(user=request.user)

      ça me semble pas très logique cette ligne.

      -
      Edité par fred1599 7 mai 2022 à 11:45:16

      • Partager sur Facebook
      • Partager sur Twitter

      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

        7 mai 2022 à 16:00:37

        Enfaites Evenement c'est ma class model

        models.py
        
        class Evenement(models.Model):
            title = models.CharField(max_length=55)
            description = models.TextField(blank=True)
            thumbnail = models.ImageField(upload_to="galerie_images")
            user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.CASCADE)
            date_creation = models.DateTimeField(auto_now_add=True)
            date_modification = models.DateTimeField(auto_now=True)
            sous_titre = models.CharField(max_length=55, blank=True)
            lieu = models.CharField(max_length=128, blank=True)
            image_article = models.ImageField(upload_to="galerie_images", blank=True, null=True )
            
            def __str__(self) :
                return self.title

        et le user je l'hérite de

         user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.CASCADE)

         ___ 

        class Utilisateur(AbstractUser):

        Par la suite, le résultat attendu serait que, dès que je valide le formulaire j'attend q ce qu'il soit entré dans la base de donnée sqlite

        • Partager sur Facebook
        • Partager sur Twitter
          7 mai 2022 à 16:17:55

          CreateForm est un formulaire qui te permet de créer un événement ? Si c'est le cas, il serait plus simple de créer ton formulaire à partir de ton modèle Evenement.

          https://docs.djangoproject.com/fr/3.2/topics/forms/modelforms/

          • Partager sur Facebook
          • Partager sur Twitter

          Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
          La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

            19 mai 2022 à 9:51:34

            Bonjour, 

            Navré pour l'attente, j'ai testé avec les modèle form, j'en arrive au même résultat.

            Cependant, j'ai modifié mon thumbnail en le mettant en null=True, et je me suis rendu compte d'une chose. 

            Sur mon panel d'administration je peu ajouter des images qui vont bien aller se loger dans /media/galerie_images

            Model.py
            
            thumbnail = models.ImageField(upload_to="galerie_images", blank=True, null=True)
            
            Setting.py
            
            MEDIA_URL = "/media/"
            MEDIA_ROOT = BASE_DIR / "media"

            Mais quand je passe par mon formulaire, l'action n'est pas faite. et donc l'image que je lui donne n'est pas chargée dans le dossier prévu a cet effet, donc c'est ce qui empêche l'implémentation dans la base de donnée.  

            form.py
            
            from django import forms
            from django.forms import ModelForm
            
            from blog.models import Evenement
            
            from django.contrib.auth import get_user_model
            User = get_user_model()
            
            class CreatForm(ModelForm):
                class Meta:
                    model = Evenement
                    fields = '__all__'
            view.py
            
            from .forms import CreatForm
            
            def new_event(request):
                if request.method == "POST":
                    form = CreatForm(request.POST)
                    if form.is_valid():
                        form.save()
                        return redirect('blog')
                else:
                    form = CreatForm()     
                return render(request, 'blog/evenement_creation.html', context={
                                                                       "form" : form,
                                                                       })
            model.py
            
            class Evenement(models.Model):
                title = models.CharField(max_length=55)
                description = models.TextField(blank=True)
                thumbnail = models.ImageField(upload_to="galerie_images", blank=True, null=True)
                user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.CASCADE)
                date_creation = models.DateTimeField(auto_now_add=True)
                date_modification = models.DateTimeField(auto_now=True)
                sous_titre = models.CharField(max_length=55, blank=True)
                lieu = models.CharField(max_length=128, blank=True)
                image_article = models.ImageField(upload_to="galerie_images", blank=True, null=True )
                
                def __str__(self) :
                    return self.title






            • Partager sur Facebook
            • Partager sur Twitter
              6 juin 2022 à 11:20:51

              bonjour, 

              un petit up, si vous avez des idées.

              Cordialement

              • Partager sur Facebook
              • Partager sur Twitter
                7 juin 2022 à 16:13:00

                je vois pas enctype="multipart/form-data" dans ton template
                • Partager sur Facebook
                • Partager sur Twitter

                Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                  7 juin 2022 à 18:18:48

                  Salut,

                  Tu devrais essayer d'ajouter ce que @fred1599 a répondu, dans ta balise form :

                  <form method="post" enctype="multipart/form-data">
                    ...
                    <button type="submit">Upload</button>
                  </form>

                  Second point, mais qui est plutôt une bonne pratique à utiliser, les chemins se définissent comme ça :

                  MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
                  • Partager sur Facebook
                  • Partager sur Twitter
                    10 juin 2022 à 9:48:43

                    Bonjour, 

                    j'ai ajouté la modif et j'ai toujours le même souci. 

                                <form method="POST" enctype="multipart/form-data">

                                    {% csrf_token %}

                                    <fieldset class="form-group">

                                      {{ form|crispy }}

                                    </fieldset>

                                </br>

                                    <div class="form-group">

                                        <div class="row justify-content-md-center">

                                            <div class="col-4">

                                                <button type="submit" class="btn btn-success">Créé l'évèvenement</button>

                                            </div>

                                            <div class="col-4">

                                                <form>

                                                    <input type="button" class="btn btn-danger" onclick="window.location.href = '{% url 'index' %}';" value="Retour à l'accueil" />

                                                </form>

                                            </div>

                                        </div> 

                                </form>

                    Pour le nommage du lien, j'utilise la version 3.9 de python et sur les tutos le conseil est d'utiliser la nouvelle nomenclature pour pas avoir a utiliser la lib "os" .

                    Mais voilà l'erreur 

                    ValueError: The 'thumbnail' attribute has no file associated with it.

                    [10/Jun/2022 09:44:26] "GET /evenement/ HTTP/1.1" 500 202589

                    from django.forms import ModelForm

                    from blog.models import Evenement

                    from django.contrib.auth import get_user_model

                    User = get_user_model()

                    class CreatForm(ModelForm):

                        class Meta:

                            model = Evenement

                            fields = '__all__'

                    (désolé pour la mise en forme mais le /code ne veux pas être pris.. )

                    -
                    Edité par Sleipnir-Ad-Sys 10 juin 2022 à 9:57:40

                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 juin 2022 à 2:19:32

                      Salut,

                      Dans ton view.py tu as (ligne 5) :

                      form = CreatForm(request.POST)


                      Dans ce lien : https://docs.djangoproject.com/fr/4.0/ref/forms/api/#binding-uploaded-files
                      je lis : # Bound form with an image field, data from the request
                      >>> f = ContactFormWithMugshot(request.POST, request.FILES)

                      Y-a-t-il une différence si tu remplaces

                      form = CreatForm(request.POST)

                      par :

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

                      ?


                      Je me suis basé sur ce lien : https://docs.djangoproject.com/fr/4.0/ref/forms/fields/#imagefield  puis je suis allé dans le lien que je cite plus haut.

                      Pré-requis indispensable : avoir Pillow installé et que ce module gère les formats d'image que tu utilises sur ton site.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 juin 2022 à 18:52:26

                        Bonjour, 

                        c'était bien le "request.FILES" qui me manquait..

                        J'avais pas vue cette donnée dans la doc.. 

                        J'avais déjà installé pillow précédemment. 

                        Merci pour ton retour ! validé fonctionnel

                        Cordialement

                        • Partager sur Facebook
                        • Partager sur Twitter

                        [Django] Implémentation dans la base Sqlite3

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown