IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Django Python Discussion :

Views.py - mettre plusieurs objets liés


Sujet :

Django Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Juin 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Juin 2020
    Messages : 25
    Par défaut Views.py - mettre plusieurs objets liés
    Hello,

    Je viens de démarrer le code en django. J'ai besoin d'aide sur une fonctionnalité me semble-t-il assez simple, mais je ne trouve pas d'explication simple malgré la doc importante en django.

    J'ai pour l'instant deux classes Book et Author, j'aimerais que ma vie fasse figurer les informations des livres ET des auteurs (nom, prénom, date de naissance).
    Par exemple :
    Victor Hugo (1802) : Les Misérables (1862)

    models.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    class Author(models.Model):
     
        name = models.fields.CharField(max_length=100)
        fistname = models.fields.CharField(max_length=100)
        date_birth = models.fields.IntegerField(
        validators=[MinValueValidator(1500), MaxValueValidator(2021)]
        )
        def __str__(self):
            return f'{self.title}'
     
    class Book(models.Model):
     
        title = models.fields.CharField(max_length=100)
        date_publication = models.fields.IntegerField(
        validators=[MinValueValidator(1500), MaxValueValidator(2021)]
        )
        author_id = models.ForeignKey(Author, null=True, on_delete=models.SET_NULL)
        def __str__(self):
            return f'{self.title}'
    views.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    from .models import Author, Book
     
    def book_list(request):
        books = Book.objects.all()
        return render(request,
        'book_list.html',
        {'books' : books})
    book_list.html
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
        <body>
     
            {% block content %}
     
            <h1>Books</h1>
     
                {% for book in books %}
     
                <p > : {{book.title}} ({{books.date_publication}})</p>
     
                {% endfor %}
     
            {% endblock %}
     
        </body>

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 50
    Par défaut
    Bonjour,

    Il y a en effet quelques erreurs basiques.
    Ton champ author_id est mal nommé car il ne contient pas un id mais un objet Author. Django et son ORM s'occupe de suffixer le nom que tu mets dans ton modèle avec un _id pour la gestion des champs en base de données (si tu ouvres ta bdd, tu dois avoir actuellement un champs nommé author_id_id du coup).
    Il vaut mieux le nommé author tout court lorsque tu l’associe à un ForeignKey.

    Ensuite pour accéder à l'objet author de ton book, tu peux simplement faire un {{book.author.XXX}} pour accéder aux différents champs de ton objet author.
    Django va automatiquement générer une requête à la base de donnée pour récupérer l'objet author souhaité. Dans ton cas, vu que tu vas tenter l'accès à cette données dans une boucle for, cela va te générer autant de requête que d’élément book parcouru. Pour prévenir ce comportement, tu peux présélectionner les objet author lors de la requête initial en utilisant select_related : books = Book.objects.all().select_related('author'). Django va générer une jointure sur la requête pour récupérer en même temps les objets author associés à chaque book.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    class Book(models.Model):
        title = models.CharField(max_length=100)
        date_publication = models.IntegerField(validators=[MinValueValidator(1500), MaxValueValidator(2021)])
        author = models.ForeignKey(Author, null=True, on_delete=models.SET_NULL)
     
        def __str__(self):
            return f'{self.title}'
     
    [...]
     
    def book_list(request):
        books = Book.objects.all()
        books = books.select_related('author')
        return render(request, 'book_list.html', {'books' : books})
     
    [...]
     
    {% for book in books %}
        <p> {{book.author.firstname}} {{book.author.name}} ({{book.author.date_birth}}) : {{book.title}} ({{books.date_publication}})</p>
    {% endfor %}

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Juin 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Juin 2020
    Messages : 25
    Par défaut
    Hello,

    Merci pour ta réponse. J'ai entretemps trouvé la solution.
    Maintenant je bloque sur des histoires de formulaires

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/10/2019, 10h40
  2. [langage] mettre plusieurs lignes en commentaire
    Par perlaud dans le forum Langage
    Réponses: 4
    Dernier message: 24/05/2004, 15h32
  3. Mettre un objet dans un TListView
    Par FredericB dans le forum C++Builder
    Réponses: 4
    Dernier message: 20/04/2004, 09h32
  4. Requêtes : recherche de maxi sur plusieur Objet
    Par pertuis dans le forum Langage SQL
    Réponses: 6
    Dernier message: 08/03/2004, 15h28
  5. Comment mettre plusieurs objets ds un composant ?
    Par Fleury dans le forum Composants VCL
    Réponses: 7
    Dernier message: 24/05/2003, 17h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo