2012-02-19 83 views
6

Mi pregunta es más fácil de explicar con un ejemplo:formato a un número de teléfono en Django

Tengo un número de teléfono almacenado en mi base de datos como una cadena de números. Supongamos que el campo se llama teléfono y está dentro de un modelo llamado Business.

Por lo tanto, para imprimir el número de teléfono en una plantilla, después de crear el var negocio en la vista que yo usaría:

{{ business.phone }} 

Esto mostrará la cadena de números como 2125476321

¿Cuál es el La mejor manera de imprimir bastante este número de teléfono como (212) 547-6321? ¿Hay algún método que pueda usar dentro del modelo?

+3

Creo que el título de esta pregunta es bastante engañosa. "Formatear un número de teléfono" o algo similar podría ser más apropiado –

Respuesta

11

Si el formato de los números de teléfono no cambia, puede escribir su propia función para formatear el número de teléfono (consulte this). Un mejor enfoque sería utilizar una biblioteca de terceros para hacerlo por usted, como python-phonenumbers. El método más sencillo es hacer algo como esto:

import phonenumbers 
class Business(models.Model): 
    phone = ... 

    def formatted_phone(self, country=None): 
     return phonenumbers.parse(self.phone, country) 

en la plantilla

# We can't pass parameters from the template so we have to hope that python-phonenumbers guesses correctly 
{{ business.formatted_phone }} 

Alternativamente (o simultáneamente) write a custom template filter para formatear el numero de teléfono. Que se vería así:

{{ business.phone|phonenumber }} or {{ business.phone|phonenumber:"GB" }} 

y escrito:

import phonenumbers 
@register.filter(name='phonenumber') 
def phonenumber(value, country=None): 
    return phonenumbers.parse(value, country) 

Si sólo se va a utilizar el formato en la plantilla, escriba un filtro de plantilla. Si cree que necesitará el formato en otros aspectos de su aplicación, por ejemplo, al enumerar los números telefónicos en el administrador, escríbalo en el modelo (pero pierda la capacidad de pasar parámetros a la función)

+6

Esto en realidad no formatea el número por usted y, en su lugar, es mejor escribir algo como: return phonenumbers.format_number (phonenumbers.parse (value, country), phonenumbers. PhoneNumberFormat.NATIONAL) – tsurantino

Cuestiones relacionadas