2012-04-07 9 views
29

Según tengo entendido, siempre debe usar un TextField para una cadena de longitud variable cuando utiliza una base de datos PostgreSQL porque la diferencia de velocidad entre TextField y CharField es despreciable con PostgreSQL. Soy relativamente nuevo en Django, y estaba considerando usar un TextField para URL de longitud variable en mi base de datos. Me preguntaba si hay ventajas de usar el URLField? ¿Se consideraría una mala forma usar un TextField en lugar de un URLField para las URL?Ventajas de usar URLField sobre TextField?

Respuesta

43

campo URLy es en realidad CharField w/soporte del patrón basado en Regexp URL de cheques y un validador en línea (que fue reemplazado por un validador basado RegEx), se puede usar TextField si no le importa longitud-limitación de URL

from django.core.validators import URLValidator 

# in model 
field = models.TextField(validators=[URLValidator()]) 

Además, el uso de CharField o TextField depende de si desea una restricción de longitud máxima en el campo y qué tipo de elemento es más adecuado para la edición: textarea o entrada. En el lado de PostgreSQL, no hay una diferencia significativa.

+8

Para el registro, [IE no puede cargar URL de más de alrededor de 2.000 caracteres] (https://stackoverflow.com/questions/417142/what-is-the- maximum-length-of-a-url-in-different-browsers), por lo que podría simplemente establecer 'max_length' en 2000 en un' URLField' y llamarlo un día. – mlissner

+0

¿Alguna referencia a la desactivación de URLField? – pravin

+0

@pravin No es el campo URL, pero su validador anterior ha quedado en desuso. El validador accedía a la URL en línea para verificar, por ahora es reemplazada por un validador de expresiones regulares para verificar la validación del formato de URL. – okm

2

https://docs.djangoproject.com/en/dev/ref/models/fields/#urlfield Por supuesto puede usar CharField/TextField pero manejando la entrada del usuario y asegúrese de que lo que el usuario ingrese depende de usted.

A partir del código fuente:

# Como con CharField, esto hará que la validación de URL para realizar

Si ve el URLField source code se encuentra en realidad es un CharField con validador URL.

También hay otros campos listos para usar como EmailField, ImageField, * ¡Campo!

2

Pruebe esta clase:

class LongURLField(TextField): 
    description = 'Long URL' 

    def __init__(self, verbose_name=None, name=None, **kwargs): 
     TextField.__init__(self, verbose_name, name, **kwargs) 
     self.validators.append(validators.URLValidator()) 

    def formfield(self, **kwargs): 
     # As with TextField, this will cause URL validation to be performed 
     # twice. 
     defaults = { 
      'form_class': forms.URLField, 
     } 
     defaults.update(kwargs) 
     return super(LongURLField, self).formfield(**defaults) 
+1

establece max_length a 2000 y tienes el campo perfecto :) – gabn88

Cuestiones relacionadas