Django RelatedManager возвращает None в шаблоне

Я пытаюсь получить доступ к связанным данным в шаблонах, но получаю только None.

модели

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver

class Product(models.Model):
    title = models.CharField(max_length=50)
    description = models.TextField()
    price = models.PositiveBigIntegerField()
    discount = models.PositiveBigIntegerField(default=0)
    inventory = models.PositiveBigIntegerField(default=1)
    last_update =  models.DateTimeField(auto_now_add=True)
    def __str__(self) -> str:
        return self.title

class Image(models.Model):
    image = models.ImageField()
    product = models.ForeignKey(to=Product,on_delete=models.CASCADE)
    
    
class Cart(models.Model):
    
    STATUS = [
        (0,"pending payment"),
        (1,"paid")
              ]
    
    status = models.SmallIntegerField(choices=STATUS,default=0)
    user = models.ForeignKey(to=User,on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now=True)
    
    def __str__(self) -> str:
        return f"{self.user} - {self.status}"
    
@receiver(post_save,sender=Cart)
def cart_post_save(sender, instance, created, *args, **kwargs):
    if created and instance.status == 1 :
        Cart.objects.create(user=instance.user)

    
        

class Order(models.Model):
    product = models.ForeignKey(to=Product,on_delete=models.CASCADE)
    count = models.PositiveIntegerField(default=0)
    cart = models.ForeignKey(to=Cart,on_delete=models.CASCADE)
    
    def __str__(self) -> str:
        return f"{self.product}"

Просмотров


from django.views import generic 
from . import models
from django.http import JsonResponse,HttpResponseBadRequest,HttpResponse

class ProductsList(generic.ListView):
    """return list of all products and template name is prudoct_list.html"""
    model = models.Product
    paginate_by = 30
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        return context
    
class ProductsDetail(generic.DetailView):
    """return a product and template name is prudoct_detail.html"""
    model = models.Product

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        return context

base.html



{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>online-shop</title>
    
</head>
<body>
    <nav>
        {% if request.user.is_anonymous %}

        {% else %}
            {{request.user}}
            <form method="post" action="{% url 'logout' %}">
                {% csrf_token %}
                <button type="submit">logout</button>
            </form>
            <a href="{% url 'cart' %}">cart</a>
            
        {% endif %}

    </nav>
    <script src="{% static 'js/jquery-3.7.1.min.js' %}"></script>
    {% block content %}
    
    {% endblock content %}

    
</body>
</html>

product_detail.html

{% extends "base.html" %}

{% block content %}

{% for image in object.image_set.all %}
    <img src="{{image.image.url}}" alt="">
{% endfor %}
<div>title : {{object.title}}</div>
<div>description : {{object.description}}</div>
<div>price : {{object.price}}</div>
<div>discount : {{object.discount}}</div>
<div>last_update : {{object.last_update}}</div>

**{{object.order_set.first}}** # returns None

{% endblock content %}

Я ожидаю список заказов в {{object.order_set.first}}, а также RelatedManager отлично работает для изображений

{% for image in object.image_set.all %}
    <img src="{{image.image.url}}" alt="">
{% endfor %} 

но для заказов я получаю только None. В product_detail выводится :

Заголовок : test123 описание : какой-то текст здесь цена : 12345 скидка : 0 last_update : 9 августа 2024 года, 19:03. Нет

также если я изменю {{object.order_set.first}} на {{object.order_set}} вывод будет

Заголовок : test123 описание : какой-то текст здесь цена : 12345 скидка : 0 last_update : 9 августа 2024 года, 19:03. stor.Order.None

python version -> 3.10.11 Django версия -> 5.1

Вы получаете None для всех связанных с менеджеров. Вы можете использовать {{ object.order_set.all }}, чтобы превратить его в набор запросов, который выведет (часть) элементов.

Но {{ object.order_set }} просто не имеет особого смысла, даже если бы он выводил записи, то выдавал бы <QuerySet [order1, order2]>, что довольно некрасиво.

Перечислите отношения и отформатируйте приказы должным образом:

{% extends "base.html" %}
{% block content %}

{% for image in object.image_set.all %}
   <img src="{{image.image.url}}" alt="">
{% endfor %}
<div>title :{{object.title}}</div>
<div>description : {{object.description}}</div>
<div>price : {{object.price}}</div>
<div>discount : {{object.discount}}</div>
<div>last_update : {{object.last_update}}</div>

{% for order in object.order_set.all %}
    <!-- ..
   -->
{% endfor %}
{% endblock content %}
Вернуться на верх