Partage
  • Partager sur Facebook
  • Partager sur Twitter

AttributeError avec Django

'QuerySet' object has no attribute '_meta'

    3 octobre 2024 à 9:09:34

    Bonjour à toutes et à tous,

    Je débute en Django et j'ai un problème que je n'arrive pas à comprendre/résoudre.

    Je fais un annuaire et je souhaite pouvoir proposer une formulaire CRUD.

    La création fonctionne (Ajout d'une entités)

    La lecture, fonctionne

    La suppression fonctionne

    Par contre, pour la mise à jour, j'ai un message d'erreur dans le navigateur.

    AttributeError at /annuaire/modifier-livre/7/

    'QuerySet' object has no attribute '_meta'

    Mon model

    annuaire/personnes/models.py

    from django.db import models
    
    class Categories(models.Model):
        nomCategorie = models.CharField(max_length=30, unique=True, verbose_name="Nom de la catégorie")
    
        class Meta:
            verbose_name = "Catégorie"
            verbose_name_plural = "Catégories"
                    
        def __str__(self):
            return self.nomCategorie
        
    class Rues(models.Model):
        nomRue = models.CharField(max_length=100, unique=True, verbose_name="Nom de la rue")
        nomRueAr = models.CharField(max_length=100, blank=True, null=True, unique=True, verbose_name="Nom de la rue (Arabe)")
        
        class Meta:
            verbose_name = "Rue"
            verbose_name_plural = "Rues"
            
        def __str__(self):
            return self.nomRue
        
    class Entites(models.Model):
        nomEntite = models.CharField(max_length=50, verbose_name="Nom de l'entitée")
        local = models.BooleanField(default=False, verbose_name="N'a pas de local")
        telEntite = models.CharField(max_length=20, null=True, blank=True)
        gsmEntite = models.CharField(max_length=20, null=True, blank=True)
        fbEntite = models.CharField(max_length=200, null=True, blank=True)
        whatsappEntite = models.CharField(max_length=200, null=True, blank=True)
        posLat = models.FloatField(null=True, blank=True)
        posLong = models.FloatField(null=True, blank=True)
        archive = models.BooleanField(default=False)
        logo = models.CharField(max_length=50, null=True, blank=True)
        photo = models.CharField(max_length=50, null=True, blank=True)
        categorie = models.ForeignKey(Categories, on_delete = models.DO_NOTHING)
        rue = models.ForeignKey(Rues, on_delete = models.DO_NOTHING)
    
        class Meta:
            verbose_name = "Entitée"
            verbose_name_plural = "Entitées"
            
        def __str__(self):
            return self.nomEntite


    Mes vues

    annuaire/personnes/views.py

    from django.shortcuts import render, get_object_or_404, redirect
    from django.http import HttpResponse
    from .models import *
    from .forms import *
    
    def index(request):
        context = {'entites': Entites.objects.all().order_by('nomEntite')}
        return render(request, "personnes/index.html", context)
    
    def voir(request, entite_id):
        context = {'entite' : get_object_or_404(Entites, pk=entite_id)}
        return render(request, "personnes/voir.html", context)
    
    def ajouter(request):
        if request.method == 'POST':
            form = FormEntite(request.POST)
            if form.is_valid():
                form.save()
                return redirect("personnes:index")
        else:
            form = FormEntite()
            
        return render(request, "personnes/entite-form.html", {"form": form})    
    
    def edit(request, entite_id):
        entite = Entites.objects.filter(pk = entite_id)
        if request.method == 'POST':
            form = FormEntite(request.POST, instance=entite)
            if form.is_valid():
                form.save()
                return redirect("personnes:index")
        else:
            form = FormEntite(instance=entite)
            
        return render(request, "personnes/entite-form.html", {"form": form})    
    
    def delete(request, entite_id):
        entite = Entites.objects.filter(pk = entite_id)
        entite.delete()
        return redirect("personnes:index")

    Mon formulaire

    annuaire/personnes/forms.py

    from django import forms
    from .models import Rues, Entites, Categories
    
    class FormEntite(forms.ModelForm):
        categorie = forms.ModelChoiceField(queryset=Categories.objects.all(), label="Catégorie")
        rue = forms.ModelChoiceField(queryset=Rues.objects.all(), label="rue")
        
        class Meta:
            model = Entites
            fields = ['nomEntite', 'local', 'telEntite',
                      'gsmEntite', 'fbEntite', 'whatsappEntite',
                      'posLat', 'posLong', 'archive', 'logo',
                      'photo', 'categorie', 'rue']
            labels = {'nomEntite': "Nom",
                      'local': 'Possède un local',
                      'gsmEntite': 'Numéro de GSM',
                      'fbEntite': 'Page facebook',
                      'whatsappEntite': 'Whatsapp',
                      'posLat': 'Latitude',
                      'posLong': 'Longitude',
                      'archive': 'Acrhivé ?',
                      'logo': 'Logo',
                      'photo': 'Photo'}



    Mes urls

    annuaire/personnes/urls.py

    from django.urls import path
    from . import views
    
    app_name = 'personnes'
    
    urlpatterns = [
        path('', views.index, name='index'),
        path('<int:entite_id>/', views.voir, name='voir'),
        path('modifier-livre/<int:entite_id>/', views.edit, name='edit'),
        path('supprimer-livre/<int:entite_id>/', views.delete, name='delete'),
        path('entite-form/', views.ajouter, name='ajouter'),
    ]

    Ma page d'affichage html

    {% include "./head.html" %}
    
    <p><a href="{% url 'personnes:ajouter'%}">+ AJOUTER UNE ENTITÉ</a></p>
    <table cellspacing="1" cellpadding="5">
      <tr>
        <th>NOM</th>
        <th>CATÉGORIE</th>
        <th>RUE</th>
        <th colspan=2>ACTIONS</th>
      </tr>
      {% for entite in entites %}
      <tr>
        <td><a href="{% url 'personnes:voir' entite.id %}">{{ entite.nomEntite }}</a></td>
        <td>{{ entite.categorie }}</td>
        <td>{{ entite.rue }}</td>
        <td><a href="{% url 'personnes:edit' entite.id %}">...</a></td>
        <td><a href="{% url 'personnes:delete' entite.id %}">X</a></td>
      </tr>
      {% endfor %}
    </table>
        <footer>
          <p>Nous somme le {% now "l d F Y" %}
        </footer>
      </body>
    </html>

    Quand je sélectionne une entité, j'ai un message d'erreur et je ne comprends pas pourquoi cela ne fonctionne pas.





    -
    Edité par Jean-pierre Bontront 3 octobre 2024 à 9:14:09

    • Partager sur Facebook
    • Partager sur Twitter
      3 octobre 2024 à 11:08:58

      Selon ce que j'ai pu voir, l'erreur viendrait du fait que filter() renvoie un QuerySet et pas une simple instance.

      L'erreur se situe en ligne 26; il faut soit rajouter .get() au filter(..) soit remplacer le .filter(...) par .get(...)

      https://stackoverflow.com/questions/48902672/getting-error-queryset-object-has-no-attribute-meta 

      • Partager sur Facebook
      • Partager sur Twitter

      AttributeError avec Django

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      • Editeur
      • Markdown