使用渲染将多个对象传递给模板
Posted
技术标签:
【中文标题】使用渲染将多个对象传递给模板【英文标题】:Pass multiple objects to templates with render 【发布时间】:2017-08-30 00:55:33 【问题描述】:我是 Django 的初学者。
我有一个包含以下模型的项目:
我的文章模型:
class Post(models.Model):
title = models.CharField(max_length=200)
slug = models.SlugField(max_length=160)
content = models.TextField()
image = models.ImageField(upload_to=upload_location)
timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
updated = models.DateTimeField(auto_now=True, auto_now_add=False)
categorie = models.CharField(max_length=200)
categorie = models.ForeignKey('categorie.Categorie')
publier = models.BooleanField()
与我的文章模型链接的我的投资组合类别模型:
class Categorieport(models.Model):
title = models.CharField(max_length=200)
article = models.OneToOneField('posts.Post')
最后,我的投资组合模型以及所有照片:
class Portfolio(models.Model):
title = models.CharField(max_length=200)
image = models.ImageField(upload_to=upload_location)
timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
updated = models.DateTimeField(auto_now=True, auto_now_add=False)
categorieportfolio = models.ForeignKey('Categorieport')
在一个视图和一个模板中,我想显示有关文章的信息以及与文章相关的投资组合。
我写了如下视图:
def portfolio(request, article=None):
portfolio = get_object_or_404(Categorieport, article=article)
image_portfolio = portfolio.portfolio_set.all()
return render(request, 'portfolio1.html', 'portfolio': portfolio, 'image_portfolio': image_portfolio)
还有以下模板:
<div class="titre-display">
<h2> portfolio.article.timestamp|date:"d E Y" / portfolio.article.categorie </h2>
<h1> portfolio.article.title</h1>
</div>
<div class="content-display">
<div class="content-display-main">
<div class="content-display-main-portfolio">
<div class="image-portfolio">
<a class="example-image-link" href=" image_portfolio.image.url " data-lightbox="example-set" data-title="image_portfolio.title">
</a>
我可以访问我的文章中的信息,但我无法访问我的投资组合中的信息。我用外壳试了一下,它工作正常。我不知道为什么它在我的视图和模板中不起作用。
你有什么想法吗?
提前谢谢你
曲风
【问题讨论】:
请正确格式化您的代码。读起来不太好。此外,请查看基于类的视图,尤其是get_context_data
方法。
【参考方案1】:
您的 image_portfolio 是一个查询集,这意味着它是某种列表,您必须使用循环来访问项目并且它们访问属性:
<div class="content-display">
<div class="content-display-main">
<div class="content-display-main-portfolio">
<div class="image-portfolio">
% for item_img in image_portfolio %
<a class="example-image-link" href=" item_img.image.url " data-lightbox="example-set" data-title="item_img.title"></a>
% endfor %
【讨论】:
【参考方案2】:试试这个:
# views.py
def portfolio(request, article=None):
# first get the Post instance with slug = article (I'm assuming article passed as url argument, is a slug)
post = get_object_or_404(Post, slug=article)
# get the Categoriepost object based on a specifi article
categorie_port = get_object_or_404(Categorieport, article=post)
# image_portfolio is a QuerySet (that is a list of Portfolio objects)
image_portfolio = categorie_port.portfolio_set.all()
return render(request, 'portfolio1.html', 'portfolio': categorie_port, 'image_portfolio': image_portfolio)
保持 HTML 不变。
【讨论】:
【参考方案3】:大家好,谢谢大家的回答。
所以,如前所述,我使用 for 循环来解决我的案例。
下面是我的代码:
<div class="titre-display">
<h2> portfolio.article.timestamp|date:"d E Y" / portfolio.article.categorie </h2>
<h1> portfolio.article.title</h1>
</div>
<div class="content-display">
<div class="content-display-main">
<div class="content-display-main-portfolio">
% for photo in image_portfolio %
<div class="image-portfolio">
<a class="example-image-link" href=" photo.image.url " data-lightbox="example-set" data-title="photo.title">
% thumbnail photo.image "300x300" crop="center" as im %
<img class="example-image" src=" im.url " />
% endthumbnail %
</a>
<p>photo.title</p>
</div>
% empty %
<p>Aucun portfolio.</p>
% endfor %
</div>
</div>
还有我的看法:
def portfolio(request, slug=None, article=None):
slug = get_object_or_404(Post, slug=slug)
portfolio = get_object_or_404(Categorieport, article=article)
image_portfolio = portfolio.portfolio_set.all()
return render(request, 'portfolio.html', 'portfolio': portfolio, 'image_portfolio': image_portfolio)
再次感谢您的帮助
曲风
【讨论】:
以上是关于使用渲染将多个对象传递给模板的主要内容,如果未能解决你的问题,请参考以下文章