Django get display name choices

30,462

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

template

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

Option #2:

archive_tag.py

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

template

{% load archive_tag %}

{% for article in articles %}
    {% for item in article.archive_quality %}
        {{ item|quality }},
    {% endfor %}
{% endfor %}
Share:
30,462
Soy Latam
Author by

Soy Latam

Soy un autodidacta en Python y me encata esto.

Updated on August 03, 2022

Comments

  • Soy Latam
    Soy Latam almost 2 years

    I'm trying to find a solution to my problem.

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

    Update The function archive_quality is important, because it prevents recurrence in the template objects.

    Example:
    article:
       My article one
    Archive:
           quality: 1111222333 >> without the function
           quality: 123 >> with function
    
  • Soy Latam
    Soy Latam about 11 years
    wow thanks all work find. You can use forloop.last to see if there is a second object. Thanks for helping.
  • user1415785
    user1415785 almost 6 years
    return dict(CHOICES_QUALITY).get(q) is shorter