Расширение общих представлений на основе классов два имеют 2 модели (САМЫЙ ПРОСТОЙ СПОСОБ) + шаблон

Мне нужно расширить (generic.DetailView):, чтобы включить в него мой второй класс, PostImage. Согласно документации (https://docs.djangoproject.com/en/4.0/topics/class-based-views/generic-display/),

class PostDetail(generic.DetailView):
    model = Post
    template_name = 'post_detail.html'

должен включать что-то вроде этого:

 def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['image_list'] = PostImage.objects.all()
        return context

models.py

from django.db import models
from django.contrib.auth.models import User
from django.forms import ImageField
from django.utils.safestring import mark_safe

STATUS = (          #tuple
    (0,"Draft"),
    (1,"Publish")
)

# Create your models here.

class Post(models.Model):
    title = models.CharField(max_length=200, unique=True)
    slug = models.SlugField(max_length=200, unique=True)
    author = models.ForeignKey(User, on_delete= models.CASCADE,related_name='blog_posts')
    updated_on = models.DateTimeField(auto_now= True)
    content = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
    status = models.IntegerField(choices=STATUS, default=0)
    image = models.ImageField(upload_to='images', null=True, blank=True)   

    class Meta:
        ordering = ['-created_on']

    def __str__(self):
        return self.title

class PostImage(models.Model):
    post = models.ForeignKey(Post, default=None, on_delete=models.CASCADE)
    image = models.ImageField(upload_to='images', null=True, blank=True)
    
    def __str__(self):
        return self.post.title

views.py

from django.views import generic
from .models import Post, PostImage


# Create your views here.

class PostList(generic.ListView):
    queryset = Post.objects.filter(status=1).order_by('-created_on')
    template_name = 'index.html'

class PostDetail(generic.DetailView):
    model = Post
    template_name = 'post_detail.html'

urls.py

from . import views
from django.urls import path

urlpatterns = [
    path('', views.PostList.as_view(), name='home'),
    path('<slug:slug>/', views.PostDetail.as_view(), name='post_detail'),
]

Могу ли я оставить урлы без изменений?

post_detail.html

{% extends 'base.html' %} {% block content %}
{% load static %}

<div class="container">
  <div class="row">
    <div class="col-md-8 card mb-4  mt-3 left  top">
      <div class="card-body">
        <h1>{% block title %} {{ object.title }} {% endblock title %}</h1>
        <p class=" text-muted">{{ post.author }} | {{ post.created_on }}</p>
        <!-- <img class="card-img-top" src= "{% url 'home' %}{{ post.image }}" alt="Card image cap"> -->
      
        <img src="{% get_media_prefix %}{{ post.image }}" class="img-fluid rounded" alt="Recipe Image Main">


        <p class="card-text "><pre class="recipe">{{ object.content }}</pre></p>
        {#  {% lorem 3 p %} #}
      </div>
    </div>

  {% block sidebar %} {% include 'sidebar.html' %} {% endblock sidebar %}
  </div>
</div>

{% endblock content %}

Сейчас post.image возвращает изображение в шаблоне, но мне нужно, чтобы postimage.image (в основном мой второй класс в моделях) также возвращал изображение... (не работает). Что я упускаю?.. Прочитал кучу документации.

Вы передаете image_list, но не вызываете его. Вы должны использовать цикл for в вашем шаблоне.

{% for img in image_list %}
    {{ img.post }}
    {{ img.image }}
{% endfor %}

Вызовы методов¶

Большинство вызовов методов, привязанных к объектам, также доступны изнутри шаблонов. Это означает, что шаблоны имеют доступ к гораздо большему, чем атрибутам класса (например, именам полей) и переменным, передаваемым из представления. Например, Django ORM предоставляет синтаксис "entry_set" для поиска коллекции объектов, связанных по внешнему ключу.

Поскольку две ваши модели имеют ForeignKey, используемый для связи друг с другом. Я думаю, что вы можете просто использовать _set без добавления дочерней модели в контекст. Вы можете просто вызвать ее в своих шаблонах примерно так:

{% for post_image in post.post_set.all %}
    {{ post_image.image }}
{% endfor %}
<
Вернуться на верх