2011-04-27 72 views
2

在我的index.html中,我試圖通過對添加的日期進行排序來獲取10個最新(漫畫書)問題,然後通過顯示這些問題的封面圖像像這樣的表:http://www.comicbookresources.com/previews在Django模板中通過Item.objects.all顯示圖像

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 }}顯示類似「圖片:驚人的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 %} 
+0

它已經在我的觀點中設置了這種方式。我會編輯它。 – AAA 2011-04-27 04:33:55

1

這樣做的一種方法是在Issue類上創建一個屬性來保存指定爲「封面」的圖像。這使您的模板儘可能簡單。如果您只想顯示一個封面,則可以爲模型管理員添加一個乾淨的方法(或者您在發佈模型中進行編輯的任何地方),以便僅允許將一個圖像指定爲「封面」 」。

#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沒有常量。

希望能幫助你。

+0

好的答案 - 一個改進是記憶'cover'屬性,以便多次調用不會多次訪問數據庫。 – 2011-04-27 08:27:11

+0

謝謝丹尼爾。我完全忘記了內置的記憶:django.core.utils.functional.memoize - 顯然我發佈答案之前需要更多的咖啡。 – Brandon 2011-04-27 13:53:05

+0

Grr。 memoize位於:1.3中的django.utils.functional – Brandon 2011-04-27 14:00:00