我需要扩展(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'),
]
我能保持urls不变吗?
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
(基本上是模型中的第二个类)返回。(不起作用)我少了什么?读一本书。
发布于 2022-07-20 15:07:24
你通过了image_list
,但不要叫它。您应该在模板中使用for循环。
{% for img in image_list %}
{{ img.post }}
{{ img.image }}
{% endfor %}
发布于 2022-07-20 15:15:38
访问方法调用 附加到对象的大多数方法调用也可以从模板中获得。这意味着模板可以访问的不仅仅是类属性(如字段名)和从视图传入的变量。例如,Django ORM提供了“entry_set”语法,用于查找外键上相关对象的集合。
因为您的两个模型都有一个用于相互关联的ForeignKey。我认为您可以使用反向查找_set
,而无需在上下文中添加子模型。您只需在模板中调用它,如下所示:
{% for post_image in post.postimage_set.all %}
{{ post_image.image }}
{% endfor %}
参考资料:Django模板:访问方法调用
https://stackoverflow.com/questions/73058693
复制相似问题