Campos numéricos localizados no Django
A criação de campos numéricos ficou muito mais fácil no Django na versão 1.2. Imagine o seguinte model:
class Debito(models.Model):
descricao = models.CharField(max_length=256)
valor = models.DecimalField(max_digits=10, decimal_places=2)
def unicode(self):
return self.descricao
E seu registro no admin
admin.site.register(Debito)
Ao tentar cadastrar um valor numérico, por exemplo: 1.450,60, receberíamos um erro já que esse formato não era entendido como numérico. Agora, basta informar que esse campo precisa ser localizado. Como isso é feito no formulário, e não no model, vamos sobrescrever o formulário padrão do admin
class DebitoForm(forms.ModelForm)
valor = forms.DecimalField(max_digits=10, decimal_places=2, localize=True)
class Meta:
model = Debito
class DebitoAdmin(admin.ModelAdmin):
form = DebitoForm
admin.site.register(Debito, DebitoAdmin)
Note o parâmetro localize
no campo DecimalField
do formulário.
Estamos quase lá, só precisamos nos certificar de que as seguintes configurações estão no settings.py
USE_L10N = True # essa é padrão
USE_THOUSAND_SEPARATOR = True
Mas ainda tem um detalhe, se você tentar acessar debito.valor
vai receber uma instância da classe decimal.Decimal
do python, e ainda terá que formatar manualmente. Felizmente o django já possui uma função pra fazer isso. Para facilitar, você pode adicionar um método no seu model:
from django.utils.formats import number_format
class Debito(models.Model):
descricao = models.CharField(max_length=256)
valor = models.DecimalField(max_digits=10, decimal_places=2)
def __unicode__(self):
return self.descricao
@property
def valor_formatado(self):
return u"R$ %s" % number_format(self.valor, 2)
Agora sim, basta acessar debito.valor_formatado
.
Confira a documentação para mais detalhes.
Até a próxima!