Django: Valor da opção de exibição

245

models.py:

class Person(models.Model):
    name = models.CharField(max_length=200)
    CATEGORY_CHOICES = (
        ('M', 'Male'),
        ('F', 'Female'),
    )
    gender = models.CharField(max_length=200, choices=CATEGORY_CHOICES)
    to_be_listed = models.BooleanField(default=True)
    description = models.CharField(max_length=20000, blank=True)

views.py:

def index(request):
    latest_person_list2 = Person.objects.filter(to_be_listed=True)
    return object_list(request, template_name='polls/schol.html',
                       queryset=latest_person_list, paginate_by=5)

No modelo, quando ligo person.gender, recebo 'M'ou em 'F'vez de 'Male'ou 'Female'.

Como exibir o valor ( 'Male'ou 'Female') em vez do código ( 'M'/ 'F')?

Shankze
fonte
4
possível duplicata de Django valor opções de impressão
Ignacio Vazquez-Abrams
Tentei este método. No meu modelo, estou usando: {% for person in object_list%} alguns html {{person.get_gender_display ()}} html {% endfor%} Estou recebendo o seguinte erro: Valor da exceção: Não foi possível analisar o restante: '()' de 'person.get_gender_display ()'
Shankze
7
Meu mau, eu não deveria ter incluído '()' após person.get_gender_display. Está funcionando agora. Obrigado.
Shankze
3
Apenas um pequeno comentário, já que o gênero será apenas M ou F (comprimento de 1 caractere), não faz sentido definir o comprimento máximo do campo de caracteres como 200. Com max_lenght=1isso, o site será mais eficiente e você garantirá que não terá dados errados. :)
Alejandro Garcia
Possível duplicata de modelos
Ciro Santilli #: 15156 Ciro Santilli 法轮功 冠状 病 六四 事件

Respostas:

502

Parece que você estava no caminho certo - get_FOO_display()é certamente o que você deseja:

Nos modelos , você não inclui ()no nome de um método. Faça o seguinte:

{{ person.get_gender_display }}
jMyles
fonte
Este método não tem preço. Mas, além de usar o método, como recuperar o valor armazenado em, digamos, {{i.item.what_to_put_here}}?
KhoPhi
11
Apenas para observar, para quem usa o Jinja2 como modelo, você deve incluir os parênteses. {{ person.get_gender_display() }}
Adam b
1
Pontos de bônus: qual é a melhor maneira de fazer isso se você estiver enviando suas informações via JSON (por exemplo, em um cenário de paginação)? Idealmente, sem a sobrecarga de instanciar os modelos um por um e chamar get_field_display ().
DylanYoung
7
Tenho que amar o Django, quase 10 anos depois, e a resposta ainda é válida! Thx +1 e beba em mim.
Marc
1
De alguma forma, isso não busca o texto traduzido. Alguma idéia de como obter o texto traduzido se o i18 já estiver implementado no site?
Anoop Nair
16

Para cada campo que possui opções definidas, o objeto terá um método get_FOO_display (), em que FOO é o nome do campo. Este método retorna o valor "legível por humanos" do campo.

Nas vistas

person = Person.objects.filter(to_be_listed=True)
context['gender'] = person.get_gender_display()

No modelo

{{ person.get_gender_display }}

Documentação de get_FOO_display ()

Muhammad Faizan Fareed
fonte
1

Outros apontaram que um método get_FOO_display é o que você precisa. Eu estou usando isso:

def get_type(self):
    return [i[1] for i in Item._meta.get_field('type').choices if i[0] == self.type][0]

que itera sobre todas as opções que um item específico tem até encontrar aquele que corresponde ao tipo de item

Daniel O'Brien
fonte