Eu tenho um modelo:
from django.db import models
CHOICES = (
('s', 'Glorious spam'),
('e', 'Fabulous eggs'),
)
class MealOrder(models.Model):
meal = models.CharField(max_length=8, choices=CHOICES)
Eu tenho um formulário:
from django.forms import ModelForm
class MealOrderForm(ModelForm):
class Meta:
model = MealOrder
E eu quero usar formtools.preview. O modelo padrão imprime a versão curta da escolha ('e' em vez de 'Ovos fabulosos'), pois usa
{% for field in form %}
<tr>
<th>{{ field.label }}:</th>
<td>{{ field.data }}</td>
</tr>
{% endfor %}.
Eu gostaria de um modelo tão geral quanto o mencionado, mas imprimindo 'Ovos fabulosos'.
[como eu duvidava de qual é a verdadeira questão, coloquei-a em negrito para todos nós :)]
Eu sei como obter a versão detalhada de uma escolha de uma maneira que é feia:
{{ form.meal.field.choices.1.1 }}
A verdadeira dor é que preciso ter a opção selecionada, e a única maneira que me vem à mente é iterar através de escolhas e verificações {% ifequals currentChoice.0 choiceField.data %}
, o que é ainda mais feio.
Isso pode ser feito facilmente? Ou ele precisa de alguma programação de tag de modelo? Isso já não deveria estar disponível no django?
fonte
A melhor solução para o seu problema é usar as funções auxiliares. Se as opções estiverem armazenadas na variável CHOICES e o campo modelo que armazena a opção selecionada for ' escolhas ', você poderá usar diretamente
no seu modelo. Aqui, x é a instância do modelo. Espero que ajude.
fonte
Peço desculpas se esta resposta for redundante com qualquer uma das listadas acima, mas parece que essa ainda não foi oferecida e parece bastante limpa. Aqui está como eu resolvi isso:
Minha visão passa um Scoop para o modelo (note: not Scoop.values ()), e o modelo contém:
fonte
Baseando-se na resposta de Noah, aqui está uma versão imune a campos sem opções:
Não tenho certeza se está tudo bem em usar um filtro para esse fim. Se alguém tiver uma solução melhor, ficarei feliz em vê-la :) Obrigado Noah!
fonte
Podemos estender a solução de filtro da Noah para ser mais universal ao lidar com tipos de dados e campos:
Aqui está o código:
fonte
Eu não acho que exista uma maneira embutida de fazer isso. Um filtro pode fazer o truque, no entanto:
Então você pode fazer:
fonte
Adicione ao seu models.py uma função simples:
Agora, você pode obter um valor detalhado dos campos de escolha como este:
Upd .: Não tenho certeza, essa solução é “pythonic” e “django-way” o suficiente ou não, mas funciona. :)
fonte
Você possui Model.get_FOO_display () em que FOO é o nome do campo que tem opções.
No seu modelo, faça o seguinte:
fonte