Django form - Jquery mask - Erro de validação por causa da máscara

1,021 views
Skip to first unread message

Samuel Ferreira Gonçalves

unread,
Nov 11, 2015, 6:55:16 AM11/11/15
to Django Brasil
Olá.

Adicionei o plugin jquery-mask para criar máscaras para os campos de meus formulário. Um destes campos, é de telefone, que deve permitir telefones de 8 ou 9 dígitos.

Até ai está funcionando bem.

Meu model está desta forma:

class ClienteTelefone(models.Model):
    numero
= models.CharField(max_length=11, blank=False, verbose_name=u'Número')
    descricao
= models.CharField(blank=True, max_length=150, verbose_name=u'Descrição')
    observacao
= models.CharField(blank=True, max_length=300, verbose_name=u'Observação')
    pessoa
= models.ForeignKey(Cliente, related_name="telefones")
   
def __str__(self):
       
#desta forma atende tanto número com 8 quanto com 9 dígitos
       
return "({}){}-{}".format(self.numero[:2], self.numero[2:-4], self.numero[-4:])

Meu form

class ClienteTelefoneForm(forms.ModelForm):
    required_css_class
= 'required'
   
class Meta:
        model
= ClienteTelefone
        exclude
= ('pessoa',)
        widgets
= {
                   
'observacao': Textarea(attrs={
                                                 
'rows':5
                                                 
}),
                   
'numero': TextInput(attrs={
                                             
'class':'telefone-mask'
                                             
}),
                   
}

Meu arquivo javascript: (Conforme exemplo do próprio site do plugin)

var SPMaskBehavior = function(val) {
       
return val.replace(/\D/g, '').length === 11 ? '(00) 00000-0000'
               
: '(00) 0000-00009';
   
}, spOptions = {
        onKeyPress
: function(val, e, field, options) {
            field
.mask(SPMaskBehavior.apply({}, arguments), options);
       
},
        placeholder
: "(__) _____-____"
   
};
    $
('.telefone-mask').mask(SPMaskBehavior, spOptions);


Quando renderizo a página, aparece tudo certo:



Então o usuário preenche os dados e clica em salvar. Dá o seguinte erro:



Queria saber se alguém já passou por isso e como resolveu.

Uma observação é que no banco irei armazenar apenas os números, a máscara é apenas para apresentação.

Existe uma forma de o validador do django considerar apenas os números?

Ou há outra saída melhor?

Desde já agradeço.


Auto Generated Inline Image 1
Auto Generated Inline Image 2

Vitor Hugo Campos

unread,
Nov 11, 2015, 7:00:01 AM11/11/15
to Django Brasil
Samuel, 

quando trabalhei com o jquery mask, antes de fazer o post, eu removia a máscara do input ( com o .unmask() ).

--
Você recebeu essa mensagem porque está inscrito no grupo "Django Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para django-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Vitor Hugo Campos

Felipe Frizzo

unread,
Nov 11, 2015, 10:16:19 AM11/11/15
to django...@googlegroups.com

Você pode aumentar o tamanho do field para 15 e salvar no banco com a máscara ou você pode criar um método no form para remove a máscara, dando replace nos parênteses e no hífen, e fazer as validações que deseja no form,  ou pode usar JS para remover a máscara antes de fazer o post como o Vitor disse.

Samuel Ferreira Gonçalves

unread,
Nov 11, 2015, 12:47:18 PM11/11/15
to Django Brasil
Boa tarde, Vitor e Felipe.

Segui a sugestão do Vitor, e funcionou.

Fiz da seguinte forma:

todo input que tem máscara tem no nome da classe o sufixo '-mask'.

Criei no javascript uma função que busca todos inputs com esse sufixo dentro de um form passado como parametero:

function remover_mascaras(form){    
    $
(form).find(':input[class*="-mask"]').unmask();
}

e no formulário, coloquei o seguinte atributo:

onsubmit="remover_mascaras(this)"

Desta forma, resolveu o problema.

Mais uma vez, muito obrigado.

Reply all
Reply to author
Forward
0 new messages