在 Django 模板中通过 Item.objects.all 显示图像
Posted
技术标签:
【中文标题】在 Django 模板中通过 Item.objects.all 显示图像【英文标题】:Displaying images through Item.objects.all in Django Template 【发布时间】:2011-08-13 11:15:31 【问题描述】:在我的 index.html 中,我试图通过对添加的日期进行排序,然后通过如下表格显示这些问题的封面图像来获取 10 个最新(漫画书)问题:http://www.comicbookresources.com/previews
模型.py:
class Image(models.Model):
CATEGORY_CHOICES = (
('Cover', 'Cover'),
('Scan', 'Scan'),
('Other', 'Other'),
)
title = models.CharField(max_length=256)
image = models.ImageField(upload_to="images/")
category = models.CharField(max_length=10, choices=CATEGORY_CHOICES)
contributor = models.ManyToManyField(Contributor, blank=True, null=True)
date_added = models.DateField(auto_now_add=True)
def __unicode__(self):
return self.title
class Meta:
ordering = ['title']
class Issue(models.Model):
title = models.ForeignKey(Title)
number = models.IntegerField(help_text="Do not include the '#'.")
....
date_added = models.DateTimeField(auto_now_add=True)
images = models.ManyToManyField(Image, related_name="images_inc", blank=True, null=True)
....
def __unicode__(self):
return u'%s #%s' % (self.title, self.number)
def get_absolute_url(self):
return "/issues/%s" % self.slug
class Meta:
ordering = ['-date_added']
Views.py
def index(request):
....
all_characters = Character.objects.all().filter(is_featured=True).order_by('name')
latest_issues = Issue.objects.order_by('-date_added')[:10]
....
t = loader.get_template('comics/index.html')
c = Context(
'all_characters': all_characters,
'latest_issues': latest_issues,
)
return HttpResponse(t.render(c))
现在,我的 index.html 文件是这样设置的:
% for issue in latest_issues %
<li class="gallery">
<a href=" issue.get_absolute_url ">
<img title=" issue.title # issue.number " src=" issue.images "></a>
<em> issue.title # issue.number </em>
</li>
% endfor %
issue.images
显示其中一个 ManyToManyDBManagex34982423 内容, issue.images.all
显示类似“图片:惊人的 X 战警 1 封面 A”之类的内容,而 issue.images.url
不显示任何内容。
我需要它来显示封面图片等等,具体来说,我需要它显示一张归类为“封面”的图片,因为有时会有不同的封面,我不希望它显示一个问题的两个封面。我确定我必须修复我的views.py,但是我将如何去做,然后我将如何在我的模板中显示它?
婴儿谈话。我是新来的。谢谢!
【问题讨论】:
【参考方案1】:这不是切片,你得到的是索引 10:
views.py:
latest_issues = Issue.objects.order_by('-date_added')[10]
你会想要的:
latest_issues = Issue.objects.order_by('-date_added')[:10]
显示某一期的所有封面图片:
% for image in issue.images.all %
% if image.category == 'Cover' %
<img src=' image.image.url ' />
% endif %
% endfor %
【讨论】:
【参考方案2】:一种方法是在问题类上创建一个属性来保存指定为“封面”的图像。这使您的模板尽可能简单。如果您只想显示一个封面,那么向您的模型管理员(或您在问题模型上进行编辑的任何地方)添加一个干净的方法也可能有意义,以仅允许将一张图像指定为“封面”。
#NOT TESTED
#models.py
from django.utils.functional import memoize
class Issue(models.Model):
images = models.ManyToManyField(Image, blank=True, null=True)
@memoize
@property # @property means this is read-only
def cover(self):
return self.images.filter(category__exact='Cover')[:1]
#views.py
def index(request):
latest_issues = Issue.objects.order_by('-date_added').select_related(depth=1)[:10]
return render(request, 'comics/index.html',
'latest_issues' : latest_issues)
#latest_issues.html
% for issue in latest_issues %
<li class="gallery">
<a href=" issue.get_absolute_url ">
<img title=" issue.title
# issue.number " src=" issue.cover.url ">
</a>
<em> issue.title # issue.number </em>
</li>
% endfor %
您可以考虑使用整数而不是字符串来保存类别的值,并将选项和选项元组放入单独的文件中,这样您就可以更轻松地在多个地方访问它们。我倾向于将它们放入“constants.py”文件中,即使 Python 没有常量。
希望对你有所帮助。
【讨论】:
好的答案 - 一种改进是记住cover
属性,这样多次调用就不会多次访问数据库。
谢谢丹尼尔。我完全忘记了内置的 memoize:django.core.utils.functional.memoize - 显然在发布答案之前我需要更多的咖啡。
Grr。 memoize 位于:1.3 中的 django.utils.functional以上是关于在 Django 模板中通过 Item.objects.all 显示图像的主要内容,如果未能解决你的问题,请参考以下文章
在 Django 模板中通过 Item.objects.all 显示图像
如何在Django中通过jQuery跟踪模板中自动生成的HTML元素的点击事件
在 javascript 中通过 django 模板检索 json 数据时出错,在参数列表后给出 Uncaught SyntaxError: missing )