¿Qué es una "babosa" en Django?

589

Cuando leo el código de Django, a menudo veo en los modelos lo que se llama "babosa". No estoy muy seguro de qué se trata, pero sí sé que tiene algo que ver con las URL. ¿Cómo y cuándo se supone que se usa esta babosa?

(He leído su definición en este glosario ).

Jonas
fuente

Respuestas:

752

Una "babosa" es una forma de generar una URL válida, generalmente utilizando datos ya obtenidos. Por ejemplo, una babosa usa el título de un artículo para generar una URL. Aconsejo generar el slug mediante una función, dado el título (u otro dato), en lugar de configurarlo manualmente.

Un ejemplo:

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

Ahora imaginemos que tenemos un modelo de Django como:

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

¿Cómo haría referencia a este objeto con una URL y con un nombre significativo? Por ejemplo, podría usar Article.id para que la URL se vea así:

www.example.com/article/23

O bien, puede hacer referencia al título de esta manera:

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

Como los espacios no son válidos en las URL, deben reemplazarse por %20, lo que da como resultado:

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

Ambos intentos no están dando como resultado una URL muy significativa y fácil de leer. Este es mejor:

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

En este ejemplo, the-46-year-old-virgines una babosa: se crea a partir del título al minúsculas todas las letras y reemplazando espacios por guiones -.

También vea la URL de esta página web para otro ejemplo.

Josh Smeaton
fuente
72
Buena descripción, pero para agregar: SlugField no garantiza la unicidad fuera de la caja, por lo que si lo usa de forma predeterminada, esta es una mejor URL: www.example.com/article/the-40-year-old-virgin/23 / Donde '23' es el artículo.id, y es lo que realmente se usa para hacer la consulta (también más rápido que consultar en el slug).
Daniel Naab el
126
Encuentro que www.example.com/article/23/the-40-year-old-virgin es más fácil de leer.
MiniQuark
16
Si sirve contenido basado en la identificación, decida si verifica que la babosa coincida con el contenido (y devuelva 404 si no lo hace) o ignórelo por completo. No creo que haya una regla general para lo mejor, en cuanto a SEO. SO seguirá mostrando esta página si ingresa stackoverflow.com/questions/427102/… en su navegador.
Tomas Andrle
2
@Daniel Solo ten en cuenta que una babosa también oculta la ID real de la base de datos, por lo que tu ejemplo vence una ventaja de usar una babosa.
Eno
15
@Eno se agrega la babosa para SEO y para permalink niceness. La identificación se utiliza para la búsqueda indexada. El SEO para stackoverflow es brillante, y utilizan exactamente esta estrategia. Su argumento fue "ocultar la identificación de la base de datos", que ahora ha convertido en "SEO". Que es el ir
Josh Smeaton
134

Si puedo proporcionar algún contexto histórico:

El término "babosa" tiene que ver con fundición de metal, plomo, en este caso, a partir del cual se hicieron las fuentes de prensa. Luego, cada papel tenía su fábrica de fuentes regularmente fundida y refundida en moldes nuevos, ya que después de muchas impresiones se desgastaron. Los aprendices como yo comenzaron su carrera allí, y llegaron a la cima (ya no más).

Los tipos de letra tenían que componer el texto de un artículo de manera retrasada con los personajes principales apilados de una manera inteligente. Entonces, al momento de la impresión, las letras estarían directamente en el papel. Todos los tipos de letra podían leer el periódico reflejado tan rápido como el impreso. Por lo tanto, las babosas (como los caracoles) y las historias lentas (las últimas que se arreglaron) eran muchas en el banco esperando, identificadas únicamente por sus letras en el puño, en general, todo el título generalmente más legible. Algunas noticias "candentes" esperaban allí en el banco, para una posible corrección de último minuto (periódico vespertino) antes del último montaje e impresión definitiva.

Django salió de las oficinas del diario Lawrence en Kansas. Donde probablemente persista alguna jerga de impresión. A-django -usiast - & - friendly-old-slug-boy-from-France.

Praveen
fuente
61

El término 'babosa' proviene del mundo de la producción de periódicos.

Es un nombre informal dado a una historia durante el proceso de producción. A medida que la historia avanza desde el reportero de ritmo (suponiendo que estos aún existan ) hasta el editor hasta las "imprentas", este es el nombre al que se hace referencia, por ejemplo, "¿Ha solucionado esos errores en el ' La historia de Kate y William ".

Algunos sistemas (como Django) usan la babosa como parte de la URL para ubicar la historia, por ejemplo www.mysite.com/archives/kate-and-william.

Incluso Stack Overflow en sí mismo hace esto, con el GEB-ish (a) autorreferencial /programming/427102/what-is-a-slug-in-django/427201#427201, aunque puede reemplazar la babosa con blahblahy todavía lo encontrará bien.

Incluso puede remontarse antes de eso, ya que los guiones tenían "líneas de babosas" al comienzo de cada escena, lo que básicamente establece el fondo para esa escena (dónde, cuándo, etc.). Es muy similar porque es un resumen o preámbulo de lo que sigue.

En una máquina Linotype, una bala era una pieza de metal de una sola línea que se creó a partir de las formas de letras individuales. Al hacer una sola bala para toda la línea, esto mejoró enormemente en la composición antigua de carácter por carácter.

Aunque lo siguiente es pura conjetura, un significado inicial de babosa era para una moneda falsificada (que de alguna manera tendría que presionarse). Podría imaginar que ese uso se transformara en el término de impresión (ya que la bala tenía que presionarse usando los caracteres originales) y, a partir de ahí, cambiar de la definición de 'pieza de metal' a la definición de 'resumen de la historia'. A partir de ahí, es un paso corto desde la impresión adecuada al mundo en línea.


(a) "Godel Escher, Bach", de un tal Douglas Hofstadter , que (al menos) considero una de las grandes obras intelectuales modernas. También debería ver su otro trabajo, "Metamas temáticas".

paxdiablo
fuente
29

Babosa es un término periodístico. Una babosa es una etiqueta corta para algo, que contiene solo letras, números, guiones bajos o guiones. Generalmente se usan en URL. (como en Django docs)

Un campo slug en Django se utiliza para almacenar y generar URL válidas para sus páginas web creadas dinámicamente.

Al igual que la forma en que agregó esta pregunta en Stack Overflow y se generó una página dinámica, y cuando vea en la barra de direcciones, verá el título de su pregunta con "-" en lugar de los espacios. Ese es exactamente el trabajo de un campo de babosas.

Ingrese la descripción de la imagen aquí

El título introducido por usted era algo así:> ¿Qué es una "babosa" en Django?

Al almacenarlo en un campo slug se convierte en "what-is-a-slug-in-django" (ver URL de esta página)

Manjit Kumar
fuente
27

A partir de aquí .

"Babosa" es un término de periódico, pero lo que significa aquí es el bit final de la URL. Por ejemplo, una publicación con el título, "Un poco sobre Django" se convertiría en "bit-about-django" automáticamente (por supuesto, puede cambiarlo fácilmente si no le gusta la babosa generada automáticamente).

BobbyShaftoe
fuente
18

Es una parte descriptiva de la URL que está ahí para hacerla más descriptiva para los humanos, pero sin que el servidor web la requiera necesariamente. ¿Qué es una "babosa" en Django? el slug es 'in-django-what-is-a-slug', pero el slug no se usa para determinar la página servida (al menos en este sitio)

Cebjyre
fuente
17

Slug es una etiqueta corta amigable con URL para contenido específico. Solo contiene letras, números, guiones bajos o guiones. Las babosas generalmente se guardan con el contenido respectivo y pasan como una cadena de URL.

Slug puede crear usando SlugField

Ex:

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

Si desea utilizar el título como slug, django tiene una función simple llamada slugify

from django.template.defaultfilters import slugify

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

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

Si necesita unicidad, agregue unique=Trueen el campo slug.

por ejemplo, del ejemplo anterior:

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

¿Eres perezoso para hacer el proceso de babosas? no te preocupes, este complemento te ayudará. django-autoslug

Simplans
fuente
8

También babosa automática en django-admin. Agregado en ModelAdmin:

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

Como aquí:

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

    prepopulated_fields = {'slug': ('title', )}
Alexey Kuzmin
fuente