Igor Sobreira

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!

blog comments powered by Disqus

My name is Igor Sobreira and is my website. I'm a software developer working at Real Geeks. I currently live in Hawaii doing the two things that I like most: windsurfing and writing software.

See more about me and get in touch.