2013-04-13 31 views
7

Sorunuma bir çözüm bulmaya çalışıyorum. şablon nesneleri tekrarını önler, çünküDjango display name options almak

models.py

class Article(models.Model): 
    title = models.CharField(max_length=100) 
    slug = models.SlugField() 
    description = models.TextField() 

def archive_quality(self): 
    return self.archive_set.order_by('-quality').distinct().values_list('quality', flat=True) 


class Archive(models.Model): 
    CHOICES_QUALITY = (
     ('1', 'HD YB'), 
     ('2', 'HD BJ'), 
     ('3', 'HD POQD'), 
     ('4', 'HD ANBC'), 
    ) 
    article = models.ForeignKey(Article) 
    quality = models.CharField(max_length=100, choices=CHOICES_QUALITY) 

arhives.html

{% for article in articles %} 
    {{ article }} 
    {% for quality in article.archive_quality %} 
     {{ quality.get_quality_display }}#This is not working 
    {% endfor %} 
{% endfor %} 

Güncelleme fonksiyon archive_quality önemlidir.

Example: 
article: 
    My article one 
Archive: 
     quality: 1111222333 >> without the function 
     quality: 123 >> with function 
+0

Eğer models.py tamamlayabilirsiniz archive_tag.py. Forloop modeliniz, – catherine

+0

@catherine Sure modelinin değişkenini kaçırdı, sadece tam modeli ekleyin. –

+0

Tüm seçenekler gerçekten '' 1''dir? – Koterpillar

cevap

9

Seçenek # 1:

models.py

CHOICES_QUALITY = (
    ('1', 'HD YB'), 
    ('2', 'HD BJ'), 
    ('3', 'HD POQD'), 
    ('4', 'HD ANBC'), 
) 

class Article(models.Model): 
    title = models.CharField(max_length=100) 
    slug = models.SlugField() 
    description = models.TextField() 

    def archive_quality(self): 
     quality = self.archive_set.order_by('-quality').distinct().values_list(
      'quality', flat=True) 
     lists = [] 
     for q in quality: 
      for choice in CHOICES_QUALITY: 
       if choice[0] == q: 
        lists.append({'quality': choice[1]}) 
     return lists 

class Archive(models.Model): 
    article = models.ForeignKey(Article) 
    quality = models.CharField(max_length=100, choices=CHOICES_QUALITY) 

şablon

{% for article in articles %} 
    {% for item in article.archive_quality %} 
     {{ item.quality }}, 
    {% endfor %} 
{% endfor %} 

Seçenek # 2:

from django import template 
from app_name.models import CHOICES_QUALITY 

register = template.Library() 

@register.filter 
def quality(q): 
    for choice in CHOICES_QUALITY: 
     if choice[0] == q: 
      return choice[1] 
    return '' 

şablon

{% load archive_tag %} 

{% for article in articles %} 
    {% for item in article.archive_quality %} 
     {{ item|quality }}, 
    {% endfor %} 
{% endfor %} 
+0

Vay, tüm iş bulmak teşekkürler. İkinci bir nesne olup olmadığını görmek için forloop.last'ı kullanabilirsiniz. Yardım için teşekkürler. –