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</code></pre></figure>

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&quot;R$ %s&quot; % number_format(self.valor, 2)</code></pre></figure>

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.