@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>
  • Вопрос задан
  • 44 просмотра
Пригласить эксперта
Ответы на вопрос 2
deepblack
@deepblack
DetailView для отображения одной записи.
Есть же документация и вводные уроки на сайте Джанги
Ответ написан
Комментировать
@Karwag Автор вопроса
Уже иправил. Не заметил что случайно вместо ListView написал DetailView. Спасибо
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы