在 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 模板中通过变量替代key取字典内容

如何在Django中通过jQuery跟踪模板中自动生成的HTML元素的点击事件

在 javascript 中通过 django 模板检索 json 数据时出错,在参数列表后给出 Uncaught SyntaxError: missing )

在 python 中通过 django-crispy-forms 渲染表单

在 django 中通过拖放对项目进行排序