@Karwag

Как вывести все данные с бд в шаблонах на главную страницу?

Мне нужно вывести все title и executor модели из бд на главную страницу. Они передаються в шаблон templates_song.html, а от туда в index.html. При моих попытках мне выдавало в одном обекте 5 title, 11 идентичных шаблонов и ошибку 'Song' object is not iterable. Буду признателен если кто-то объяснит что мне нужно исправить

models.py
from django.db import models


class Tool(models.Model):
    name = models.CharField(verbose_name='Инструмент', max_length=255)
    slug = models.SlugField(unique=True)

    class Meta:
        verbose_name_plural = "Музыкальные инструменты"

    def __str__(self):
        return self.name


class Song(models.Model):
    title = models.CharField(max_length=255, verbose_name='Название')
    executor = models.CharField(max_length=255, verbose_name='Исполнитель')
    img_executor = models.ImageField(verbose_name="Изображение группы", blank=True)
    musical_instrument = models.ForeignKey(Tool, verbose_name='Инструмент', on_delete=models.CASCADE)
    chords = models.CharField(max_length=255, verbose_name="Аккорды")
    tabs_chords1 = models.ForeignKey('GuitarTabs', related_name='related_tabs_chords1', verbose_name='Априкатура', on_delete=models.CASCADE, blank=True, null=True)
    tabs_chords2 = models.ForeignKey('GuitarTabs', related_name='related_tabs_chords2', verbose_name='Априкатура', on_delete=models.CASCADE, blank=True, null=True)
    tabs_chords3 = models.ForeignKey('GuitarTabs', related_name='related_tabs_chords3', verbose_name='Априкатура', on_delete=models.CASCADE, blank=True, null=True)
    tabs_chords4 = models.ForeignKey('GuitarTabs', related_name='related_tabs_chords4', verbose_name='Априкатура', on_delete=models.CASCADE, blank=True, null=True)
    tabs_chords5 = models.ForeignKey('GuitarTabs', related_name='related_tabs_chords5', verbose_name='Априкатура', on_delete=models.CASCADE, blank=True, null=True)
    tabs_chords6 = models.ForeignKey('GuitarTabs', related_name='related_tabs_chords6', verbose_name='Априкатура', on_delete=models.CASCADE, blank=True, null=True)
    tabs_chords7 = models.ForeignKey('GuitarTabs', related_name='related_tabs_chords7', verbose_name='Априкатура', on_delete=models.CASCADE, blank=True, null=True)
    tabs_chords8 = models.ForeignKey('GuitarTabs', related_name='related_tabs_chords8', verbose_name='Априкатура', on_delete=models.CASCADE, blank=True, null=True)
    tabs_chords9 = models.ForeignKey('GuitarTabs', related_name='related_tabs_chords9', verbose_name='Априкатура', on_delete=models.CASCADE, blank=True, null=True)
    tabs_chords10 = models.ForeignKey('GuitarTabs', related_name='related_tabs_chords10', verbose_name='Априкатура', on_delete=models.CASCADE, blank=True, null=True)
    tabs_chords11 = models.ForeignKey('GuitarTabs', related_name='related_tabs_chords11', verbose_name='Априкатура', on_delete=models.CASCADE, blank=True, null=True)
    tabs_chords12 = models.ForeignKey('GuitarTabs', related_name='related_tabs_chords12', verbose_name='Априкатура', on_delete=models.CASCADE, blank=True, null=True)
    hit = models.ForeignKey('GuitarHit', related_name='related_hit', verbose_name="Бой", on_delete=models.CASCADE)
    text = models.TextField(verbose_name='Текст песни')

    class Meta:
        verbose_name_plural = "Песни"

    def __str__(self):
        return "{} : {}".format(self.executor, self.title)


class GuitarTabs(models.Model):
    title = models.CharField(max_length=255, verbose_name='Название')
    slug = models.SlugField(unique=True)
    tabs = models.ImageField(verbose_name="Табы", blank=True)

    class Meta:
        verbose_name_plural = "Гитарные априкатуры"

    def __str__(self):
        return self.title


class GuitarHit(models.Model):
    title = models.CharField(max_length=255, verbose_name='Название')
    slug = models.SlugField(unique=True)
    hit = models.CharField(max_length=255, verbose_name="Бой")

    class Meta:
        verbose_name_plural = "Гитарные бои"

    def __str__(self):
        return "{} : {}".format(self.title, self.hit)


views.py
from django.shortcuts import render
from django.views.generic import DetailView
from .models import *


class HomeDetailViews(DetailView):
    model = Song
    queryset = Song.objects.all()
    template_name = "templates_song.html"
    context_object_name = 'songs'


urls.py
from django.urls import path, include
from .views import *

urlpatterns = [
    path('first-post/<int:pk>/', HomeDetailViews.as_view(), name='homeviews'),
]


templates_song.html
{% extends 'index.html' %}

{%block navigate%}
 <nav class="navbar navbar-expand-lg navbar-light bg-light">
            <div class="container px-4 px-lg-5">
                <a class="navbar-brand" href="#!">GuiratPub</a>
                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button>
                <div class="collapse navbar-collapse" id="navbarSupportedContent">
                    <ul class="navbar-nav me-auto mb-2 mb-lg-0 ms-lg-4">
                        <li class="nav-item"><a class="nav-link active" aria-current="page" href="#!">Главная</a></li>
                        <li class="nav-item"><a class="nav-link" href="#!">Популярные</a></li>
                        <li class="nav-item dropdown">
                            <a class="nav-link dropdown-toggle" id="navbarDropdown" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">Категории</a>
                            <ul class="dropdown-menu" aria-labelledby="navbarDropdown">
                                <li><a class="dropdown-item" href="#!">Зарубежные</a></li>
                                <li><hr class="dropdown-divider" /></li>
                                <li><a class="dropdown-item" href="#!">Класические</a></li>
                                <li><a class="dropdown-item" href="#!">Новые</a></li>
                            </ul>
                        </li>
                    </ul>
                    <form class="d-flex">
                        <button class="btn btn-outline-dark" type="submit">
                            Аккорды
                        </button>
                    </form>
                </div>
            </div>
        </nav>
{%endblock%}


{%block content%}
   {%for song in songs%}
                    <div class="col mb-5">
                        <div class="card h-100">
                            <!-- Product image-->
                            <img class="card-img-top" src="https://dummyimage.com/450x300/dee2e6/6c757d.jpg" alt="..." />
                            <!-- Product details-->
                            <div class="card-body p-4">
                                <div class="text-center">
                                    <!-- Product name-->
                                    <h5 class="fw-bolder">
                                           {{song.title}}
                                    </h5>
                                    <!-- Product price-->
                                   {{song.executor}}
                                </div>
                            </div>
                            <!-- Product actions-->
                            <div class="card-footer p-4 pt-0 border-top-0 bg-transparent">
                                <div class="text-center"><a class="btn btn-outline-dark mt-auto" href="#">Просмотреть</a></div>
                            </div>
                        </div>
                    </div>
{%endfor%}
{%endblock%}


index.html
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
        <meta name="description" content="" />
        <meta name="author" content="" />
        <title>GuitarPub</title>
        <!-- Favicon-->
        <link rel="icon" type="image/x-icon" href="assets/favicon.ico" />
        <!-- Bootstrap icons-->
        <link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css" rel="stylesheet" />
        <!-- Core theme CSS (includes Bootstrap)-->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-+0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7+AMvyTG2x" crossorigin="anonymous">
    </head>
    <body>
        <!-- Navigation-->
       {%block navigate%}
        {%endblock%}
        <!-- Header-->
        <header class="bg-dark py-5">
            <div class="container px-4 px-lg-5 my-5">
                <div class="text-center text-white">
                    <h1 class="display-4 fw-bolder">GuitarPub</h1>
                    <p class="lead fw-normal text-white-50 mb-0">Аккорды и табы песен</p>
                </div>
            </div>
        </header>
        <!-- Section-->
        <section class="py-5">
            <div class="container px-4 px-lg-5 mt-5">
                <div class="row gx-4 gx-lg-5 row-cols-2 row-cols-md-3 row-cols-xl-4 justify-content-center">

                    {%block content%}
                    {%endblock%}

                </div>
            </div>
        </section>
        <!-- Footer-->
        <footer class="py-5 bg-dark">
            <div class="container"><p class="m-0 text-center text-white">Сайт сделан при поддержки Вадима 2021</p></div>
        </footer>
        <!-- Bootstrap core JS-->
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.bundle.min.js"></script>
        <!-- Core theme JS-->
        <script src="js/scripts.js"></script>
    </body>
</html>
  • Вопрос задан
  • 61 просмотр
Пригласить эксперта
Ответы на вопрос 2
deepblack
@deepblack Куратор тега Django
DetailView для отображения одной записи.
Есть же документация и вводные уроки на сайте Джанги
Ответ написан
Комментировать
@Karwag Автор вопроса
Уже иправил. Не заметил что случайно вместо ListView написал DetailView. Спасибо
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы