Che cos'è una "lumaca" in Django?


589

Quando leggo il codice Django vedo spesso nei modelli quello che viene chiamato "lumaca". Non sono del tutto sicuro di cosa si tratti, ma so che ha qualcosa a che fare con gli URL. Come e quando dovrebbe essere usata questa lumaca?

(Ho letto la sua definizione in questo glossario .)

Risposte:


752

Uno "slug" è un modo per generare un URL valido, generalmente usando i dati già ottenuti. Ad esempio, una lumaca utilizza il titolo di un articolo per generare un URL. Consiglio di generare la lumaca tramite una funzione, dato il titolo (o un altro dato), piuttosto che impostarlo manualmente.

Un esempio:

<title> The 46 Year Old Virgin </title>
<content> A silly comedy movie </content>
<slug> the-46-year-old-virgin </slug>

Ora facciamo finta di avere un modello Django come:

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField(max_length=1000)
    slug = models.SlugField(max_length=40)

Come riferiresti questo oggetto con un URL e con un nome significativo? Ad esempio, potresti usare Article.id in modo che l'URL sia simile al seguente:

www.example.com/article/23

Oppure, potresti voler fare riferimento al titolo in questo modo:

www.example.com/article/The 46 Year Old Virgin

Poiché gli spazi non sono validi negli URL, devono essere sostituiti da %20, il che si traduce in:

www.example.com/article/The%2046%20Year%20Old%20Virgin

Entrambi i tentativi non danno come risultato URL molto significativi e di facile lettura. Questo è meglio:

www.example.com/article/the-46-year-old-virgin

In questo esempio, the-46-year-old-virginè una lumaca: è stata creata dal titolo, incassando tutte le lettere e sostituendo gli spazi con trattini -.

Vedi anche l'URL di questa stessa pagina web per un altro esempio.


72
Buona descrizione, ma per aggiungere: SlugField non garantisce l'unicità fuori dalla scatola, quindi se lo si utilizza per impostazione predefinita, questo è un URL migliore: www.example.com/article/the-40-year-old-virgin/23 / Dove '23' è article.id, ed è ciò che è effettivamente utilizzato per eseguire la query (anche più veloce di una query sulla lumaca).
Daniel Naab,

126
Trovo che www.example.com/article/23/the-40-year-old-virgin sia più facile da leggere.
MiniQuark

16
Se offri contenuti in base all'ID, decidi se verificare che lo slug corrisponda al contenuto (e restituisca 404 se non lo fa) o ignoralo completamente. Non credo che ci sia una regola generale per ciò che è meglio, dal punto di vista SEO. SO visualizzerà comunque questa pagina se si inserisce stackoverflow.com/questions/427102/… nel browser.
Tomas Andrle,

2
@Daniel Ricorda solo che una lumaca nasconde anche l'ID del database reale, quindi il tuo esempio vanifica un vantaggio dell'uso di una lumaca.
Eno

15
@Eno la lumaca viene aggiunta per SEO e per permalink nicey-ness. L'ID viene utilizzato per la ricerca indicizzata. Il SEO per StackOverflow è eccezionale e usano esattamente questa strategia. Il tuo argomento era "nascondi l'ID del database", che ora hai trasformato in "SEO". Che succede?
Josh Smeaton,

134

Se posso fornire un contesto storico:

Il termine "lumaca" ha a che fare con la fusione di metallo - piombo, in questo caso - con il quale sono stati creati i caratteri di stampa. In seguito, ogni fabbrica di font aveva regolarmente rifuso e rifuso in stampi nuovi, poiché dopo molte stampe si usurava. Gli apprendisti come me hanno iniziato la loro carriera lì, e sono saliti fino in cima (non più).

I tipografi hanno dovuto comporre il testo di un articolo in modo arretrato con personaggi principali impilati in modo saggio. Quindi al momento della stampa le lettere sarebbero state direttamente sul foglio. Tutti i tipografi potevano leggere il giornale rispecchiato alla stessa velocità di quello stampato. Pertanto le lumache (come le lumache) anche le storie lente (le ultime da sistemare) erano molte in panchina in attesa, identificate unicamente dalle loro lettere di pugno, per lo più l'intero titolo generalmente più leggibile. Alcune notizie "calde" stavano aspettando lì in panchina, per possibili correzioni dell'ultimo minuto, (giornale della sera) prima dell'ultimo assemblaggio e della stampa definitiva.

Django è emerso dagli uffici della rivista Lawrence in Kansas. Laddove probabilmente permane qualche gergo tipografico. A-django-entusiasta - & - friendly-old-lumaca-boy-da-France.


61

Il termine "lumaca" deriva dal mondo della produzione di giornali.

È un nome informale dato a una storia durante il processo di produzione. Mentre la storia si snoda dal beat reporter (supponendo che esistano ancora?) Fino all'editor fino alle "macchine da stampa", questo è il nome a cui fa riferimento, ad esempio "Hai corretto quegli errori nel ' la storia di Kate-and-William? ".

Alcuni sistemi (come Django) usano la lumaca come parte dell'URL per localizzare la storia, ad esempio www.mysite.com/archives/kate-and-william.

Anche Stack Overflow stesso fa questo, con l' autoreferenzialità GEB-ish (a)/programming/427102/what-is-a-slug-in-django/427201#427201 , anche se è possibile sostituire la lumaca con blahblahe lo troverà comunque a posto.

Potrebbe anche risalire a prima, dato che le sceneggiature avevano "linee di lumache" all'inizio di ogni scena, che fondamentalmente imposta lo sfondo per quella scena (dove, quando e così via). È molto simile in quanto è un prec o preambolo di ciò che segue.

Su una macchina Linotype, una lumaca era un pezzo di metallo a linea singola creato dalle singole forme di lettere. Creando una singola lumaca per l'intera linea, questo ha notevolmente migliorato la vecchia composizione carattere per carattere.

Sebbene quanto segue sia pura congettura, un significato iniziale di lumaca era per una moneta contraffatta (che avrebbe dovuto essere premuta in qualche modo). Potrei immaginare che l'uso venga trasformato nel termine di stampa (poiché la lumaca doveva essere pressata usando i caratteri originali) e da lì, passando dalla definizione di "pezzo di metallo" alla definizione di "sommario della storia". Da lì, è un breve passo dalla corretta stampa al mondo online.


(a) "Godel Escher, Bach", di un Douglas Hofstadter , che io (almeno) considero una delle grandi opere intellettuali moderne. Dovresti anche dare un'occhiata al suo altro lavoro, "Metamagical Themas".


29

Slug è un termine da giornale. Una lumaca è un'etichetta corta per qualcosa, contenente solo lettere, numeri, trattini bassi o trattini. Sono generalmente utilizzati negli URL. (come nei documenti Django)

Un campo lumaca in Django viene utilizzato per archiviare e generare URL validi per le pagine Web create dinamicamente.

Proprio come il modo in cui hai aggiunto questa domanda su Stack Overflow e una pagina dinamica è stata generata e quando vedi nella barra degli indirizzi vedrai il titolo della domanda con "-" al posto degli spazi. Questo è esattamente il lavoro di un campo di lumache.

Inserisci qui la descrizione dell'immagine

Il titolo inserito da te era qualcosa del genere -> Che cos'è una "lumaca" in Django?

Memorizzandolo in un campo lumaca diventa "what-is-a-slug-in-django" (vedi URL di questa pagina)


27

Da qui .

"Slug" è un termine di giornale, ma ciò che significa qui è l'ultimo bit dell'URL. Ad esempio, un post con il titolo "Un po 'di Django" diventerebbe automaticamente "un po' di Django" (puoi ovviamente cambiarlo facilmente se non ti piace la lumaca generata automaticamente).


18

È una parte descrittiva dell'URL che è lì per renderlo più descrittivo, ma senza essere necessariamente richiesto dal web server - in Cos'è uno "slug" in Django? lo slug è 'in-django-what-is-a-slug', ma lo slug non viene utilizzato per determinare la pagina pubblicata (almeno su questo sito)


17

Slug è un'etichetta breve compatibile con URL per contenuti specifici. Contiene solo lettere, numeri, trattini bassi o trattini. Le lumache vengono generalmente salvate con il rispettivo contenuto e passano come stringa URL.

Slug può creare usando SlugField

Ex:

class Article(models.Model):
    title = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100)

Se vuoi usare il titolo come lumaca, django ha una semplice funzione chiamata slugify

from django.template.defaultfilters import slugify

class Article(models.Model):
    title = models.CharField(max_length=100)

    def slug(self):
        return slugify(self.title)

Se necessita di unicità, aggiungi unique=Truenel campo lumaca.

ad esempio, dall'esempio precedente:

class Article(models.Model):
    title = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100, unique=True)

Sei pigro per fare il processo di lumaca? non ti preoccupare, questo plugin ti aiuterà. django-autoslug


8

Anche auto slug su django-admin. Aggiunto in ModelAdmin:

prepopulated_fields = {'slug': ('title', )}

Come qui:

class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title', 'slug')
    search_fields = ('content', )

    prepopulated_fields = {'slug': ('title', )}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.