在Django模板中通过Item.objects.all显示图像

时间:2011-04-27 00:22:28

标签: django django-templates django-orm

在我的index.html中,我试图通过对添加的日期进行排序,然后通过如下表格显示这些问题的封面图片来获取10个最新(漫画书)问题:http://www.comicbookresources.com/previews < / p>

Models.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 alt="{{ issue.title }} #{{ issue.number }}" title="{{ issue.title }} #{{ issue.number }}" src="{{ issue.images }}"></a>
<em>{{ issue.title }} #{{ issue.number }}</em>
</li>
{% endfor %}

{{ issue.images }}显示其中一个ManyToManyDBManagex34982423内容,{{ issue.images.all }}显示类似“Image:Astonishing X-Men 1 Cover A”,而{{ issue.images.url }}则不显示任何内容。

我需要它来显示封面图片等等,具体来说,我需要它显示一个被归类为“封面”的图像,因为有时会有变体封面,我不想要它显示一个问题的两个封面。我确定我必须修复我的views.py,但是如何进行此操作然后我将如何在我的模板中显示它?

宝贝说话。我是新来的。谢谢!

2 个答案:

答案 0 :(得分: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 %}

答案 1 :(得分:1)

执行此操作的一种方法是在Issue类上创建一个属性,以将Image指定为“cover”。这使您的模板尽可能简单。如果您只想显示一个封面,那么向模型管理员添加一个干净的方法(或者您在“问题”模型上进行编辑的任何地方)也可能只允许将一个图像指定为“封面” ”

#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 alt="{{ issue.title }} #{{ issue.number }}" title="{{ issue.title }}
            #{{ issue.number }}" src="{{ issue.cover.url }}">
    </a>
    <em>{{ issue.title }} #{{ issue.number }}</em>
</li>
{% endfor %}

您可以考虑使用整数来保存类别而不是字符串的值,并将选项和选项元组放在一个单独的文件中,这样您就可以在一个以上的位置轻松访问它们。我倾向于将这些文件放入“constants.py”文件中,即使Python没有常量。

希望能帮到你。