Расширение общих представлений на основе классов два имеют 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 %}
<