@mezigar

Почему не отображаются данные?

Есть модели :
from django.db import models


class Cocktail(models.Model):
    title = models.CharField(max_length=50, db_index=True, verbose_name='Название')
    ingredients = models.ManyToManyField('Ingredient', verbose_name='Ингредиент')

    # Stars or rating = Many to One

    def __str__(self):
        return f"{self.title}: {self.id} "

    class Meta:
        verbose_name_plural = 'Коктейли'
        verbose_name = 'Коктейль'


class Ingredient(models.Model):
    title = models.CharField(max_length=30, db_index=True, verbose_name='Название')

    def __str__(self):
        return self.title

    class Meta:
        verbose_name_plural = 'Ингредиенты'
        verbose_name = 'Ингредиент'

Есть вьюхи:
from django.http import HttpResponse
from django.shortcuts import render

from .models import Cocktail


def by_cocktail_id(request, cocktail_id):
    cocktail = Cocktail.objects.all().filter(id=cocktail_id)
    # cocktail = Cocktail.objects.get(id=cocktail_id)
    context = {'cocktail': cocktail}
    return render(request, 'by_cocktail_id.html', context)


def by_cocktail_name(request, cocktail_name):
    cocktail = Cocktail.objects.all().filter(title=cocktail_name)
    context = {'cocktail': cocktail}
    return render(request, 'by_cocktail_name.html', context)


def index(request):
    return HttpResponse("Здесь будет выведен список коктейлей.")

Файл с урлами:
from django.urls import path

from .views import index, by_cocktail_id, by_cocktail_name

urlpatterns = [
    path('<int:cocktail_id>/', by_cocktail_id),
    path('<str:cocktail_name>/', by_cocktail_name),
    path('', index),
]


Базовый шаблон html:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>{% block title %} {% endblock title %}</title>
    </head>
    {% block content %}

    {% endblock content %}
    </body>
</html>

И файл html:
{% extends "base.html" %}

{% block title %}
    {{ cocktail.title }}
{% endblock %}

{% block content %}
    <div>
        <h3>Коктейль номер {{ cocktail.id }}</h3>
        <lu>

            {% for ingredient in cocktail.ingredients %}
            <li>
                <p>{{ ingredient }}</p>
            </li>
            {% endfor %}

        </lu>
    </div>
{% endblock %}

В итоге данные не выводятся, пустой шаблон. В девтулах никаких данных в html нет, куда данные деваются?
  • Вопрос задан
  • 68 просмотров
Пригласить эксперта
Ответы на вопрос 1
AlexNest
@AlexNest Куратор тега Python
Работаю с Python/Django
По какому, конкретно, адресу? Проблема, возможно, в том, что у вас равносильные, с точки зрения парсера урлы:
urlpatterns = [
    path('<int:cocktail_id>/', by_cocktail_id),
    path('<str:cocktail_name>/', by_cocktail_name),
    path('', index),


]


И допустим есть урл вида: mysite.ru/1/
И как django должен это понимать? 1 как строку, 1 как число?
Для начала, выделите роуты более конкретно. Далее - проверяйте каждый роут отдельно. Есть как минимум несколько "точек внимания": Какие данные приходят? Находит ли django коктейли в базе (print в консоль)? Правильно ли передаются ли данные в шаблон?
И да, использовать в качестве роута название в чистом виде - сомнительная практика. Как минимум, если в названии есть пробелы, то они заменятся на %20 И тогда в качестве параметра придет что-то вроде:
имя%20коктейля
Используйте slug
Ответ написан
Ваш ответ на вопрос

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

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