2011-04-27 1 views
2

Dans mon index.html, j'essaie de saisir les 10 derniers problèmes (bande dessinée) en triant la date ajoutée et en affichant l'image de couverture de ces problèmes via une table comme ceci: http://www.comicbookresources.com/previewsAffichage d'images à l'aide de Item.objects.all dans Django Template

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)) 

maintenant, voici comment mon fichier index.html est configuré:

{% 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 }} affiche une de ces choses ManyToManyDBManagex34982423 et {{ issue.images.all }} affiche quelque chose comme "Image: Astonishing X-Men 1 Couverture A", tandis que {{ issue.images.url }} affiche rien.

Je l'ai besoin pour afficher l'image de couverture et plus, en particulier, j'ai besoin d'afficher une image qui est classée comme 'Cover', parce que parfois il y a des couvertures de variantes, et je ne voudrais pas en afficher deux couvertures d'un numéro. Je suis sûr que je devrais corriger mon views.py, mais comment j'irais faire ceci et comment l'afficherais-je dans mon modèle?

Parlez bébé. Je suis nouveau à cela. Merci!

Répondre

1

Ce n'est pas trancher, vous obtenez index 10:

views.py:

latest_issues = Issue.objects.order_by('-date_added')[10] 

vous voulez:

latest_issues = Issue.objects.order_by('-date_added')[:10] 

Pour afficher toutes les images de couverture pour un problème:

{% for image in issue.images.all %} 
    {% if image.category == 'Cover' %} 
    <img src='{{ image.image.url }}' /> 
    {% endif %} 
{% endfor %} 
+0

C'est déjà défini dans mes vues. Je vais l'éditer. – AAA

1

Une façon de le faire est pour créer une propriété sur la classe Issue afin de conserver l'image spécifiée comme "couverture". Cela permet de garder votre modèle aussi simple que possible. Si vous ne souhaitez afficher qu'une seule couverture, il peut également être judicieux d'ajouter une méthode propre à votre administrateur de modèle (ou à l'endroit où vous éditez sur le modèle Issue) afin de ne permettre qu'une seule image comme couverture. ".

#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 %} 

Vous pouvez envisager d'utiliser des entiers pour contenir les valeurs pour les catégories au lieu de chaînes, et de mettre également les choix et les choix tuple dans un fichier séparé afin que vous puissiez y accéder à plus d'un endroit un peu plus facile. J'ai tendance à les mettre dans un fichier "constants.py", même si Python n'a pas de constantes.

Un espoir qui vous aide.

+0

Bonne réponse - un raffinement consisterait à mémoriser la propriété 'cover' afin que plusieurs appels ne touchent pas la base de données plusieurs fois. –

+0

Merci Daniel. J'ai complètement oublié le memoize intégré: django.core.utils.functional.memoize - évidemment, j'ai besoin de plus de café avant de poster des réponses. – Brandon

+0

Grr. memoize est à: django.utils.functional in 1.3 – Brandon