2012-04-07 7 views
29

Come ho capito, si dovrebbe sempre usare uno TextField per una stringa di lunghezza variabile quando si utilizza un database PostgreSQL perché la differenza di velocità tra uno TextField e uno CharField è trascurabile con PostgreSQL. Sono relativamente nuovo a Django e stavo considerando l'utilizzo di uno TextField per URL di lunghezza variabile nel mio database. Mi chiedevo se ci sono dei vantaggi nell'utilizzo di URLField? Sarebbe considerata una cattiva forma usare uno TextField piuttosto che uno URLField per gli URL?Vantaggi dell'utilizzo di URLField su TextField?

risposta

43

URLField è in realtà CharField w/supporto del modello Regexp a base URL corrente e un validatore online (che è stato sostituito da un validatore basato RegEx), è possibile utilizzare TextField se non vi interessa la lunghezza-limitazione della URL

Inoltre, l'utilizzo di CharField o TextField dipende dal vincolo della lunghezza massima sul campo e dal tipo di elemento più adatto per la modifica: area di testo o input. Sul lato PostgreSQL, non vi è alcuna differenza significativa.

+8

Per la cronaca, [IE non può caricare gli URL più lungo di circa 2.000 caratteri] (https://stackoverflow.com/questions/417142/what-is-the- lunghezza massima di un URL in diversi browser), quindi è possibile impostare 'max_length' su 2000 su un' URLField' e chiamarlo un giorno. – mlissner

+0

Qualche riferimento alla deprecazione di URLField? – pravin

+0

@pravin Non è l'URLField ma il suo precedente validatore è stato deprecato. Il validatore stava accedendo all'URL online per verificare, per ora è sostituito da un validatore regex per verificare la convalida del formato dell'URL. – okm

2

https://docs.djangoproject.com/en/dev/ref/models/fields/#urlfield Ovviamente è possibile utilizzare CharField/TextField ma gestire l'input dell'utente e assicurarsi che tutto ciò che l'utente inserisce sia pronto.

Dal codice sorgente:

# Come con CharField, questo farà sì che la convalida URL da eseguire

Se si vede il URLField source code troverete in realtà è un CharField con validatore URL.

Inoltre ci sono altri campi pronti per l'uso come EmailField, ImageField, * Field!

2

Prova questa classe:

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

imposta max_length su 2000 e hai il campo perfetto :) – gabn88