O que é uma "lesma" no Django?

589

Quando leio o código do Django, vejo frequentemente nos modelos o que é chamado de "lesma". Não sei bem o que é isso, mas sei que isso tem algo a ver com URLs. Como e quando essa coisa de lesma deve ser usada?

(Li sua definição neste glossário .)

Jonas
fonte

Respostas:

752

Uma "lesma" é uma maneira de gerar uma URL válida, geralmente usando dados já obtidos. Por exemplo, uma lesma usa o título de um artigo para gerar um URL. Aconselho a gerar a lesma por meio de uma função, dado o título (ou outro dado), em vez de defini-la manualmente.

Um exemplo:

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

Agora vamos fingir que temos um modelo do Django como:

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

Como você faria referência a esse objeto com uma URL e um nome significativo? Você pode, por exemplo, usar Article.id para que a URL fique assim:

www.example.com/article/23

Ou você pode querer referenciar o título assim:

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

Como os espaços não são válidos nos URLs, eles devem ser substituídos por %20, o que resulta em:

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

Ambas as tentativas não resultam em URL muito significativo e fácil de ler. Isto é melhor:

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

Neste exemplo, the-46-year-old-virginé uma lesma: ela é criada a partir do título, colocando em caixa baixa todas as letras e substituindo os espaços por hífens -.

Veja também o URL desta página da Web para outro exemplo.

Josh Smeaton
fonte
72
Boa descrição, mas é preciso acrescentar: o SlugField não garante a exclusividade imediata, portanto, se usá-lo por padrão, esse é um URL melhor: www.example.com/article/the-40-year-old-virgin/23 / Onde '23' é o article.id e é o que realmente é usado para fazer a consulta (também mais rápido que a consulta na lesma).
911 Daniel Naab
126
Acho www.example.com/article/23/the-40-year-old-virgin mais fácil de ler.
MiniQuark 9/01/2009
16
Se você veicular conteúdo com base no ID, decida se o slug corresponde ao conteúdo (e retorne 404, se não for o caso) ou ignore-o completamente. Eu não acho que exista uma regra geral para o que é melhor, em termos de SEO. O SO ainda exibirá esta página se você digitar stackoverflow.com/questions/427102/… no seu navegador.
Tomas Andrle 02/09/09
2
@ Daniel Apenas lembre-se de que uma lesma também oculta o ID real do banco de dados; portanto, seu exemplo derrota uma vantagem de usar uma lesma.
Eno
15
@Eno a lesma é adicionada para SEO e para permalink nicey-ness. O ID é usado para pesquisa indexada. O SEO do stackoverflow é brilhante - e eles usam exatamente essa estratégia. Seu argumento foi "ocultar o ID do banco de dados", que você transformou em "SEO". Qual é o problema?
Josh Smeaton
134

Se eu puder fornecer algum contexto histórico:

O termo "lesma" tem a ver com fundição de metal - chumbo, neste caso - a partir do qual as fontes da imprensa foram feitas. Todos os papéis tinham suas fábricas de fontes re-derretidas e reformuladas regularmente em moldes novos, pois após muitas impressões elas se desgastavam. Aprendizes como eu começaram sua carreira lá, e foram até o topo (não mais).

Os tipógrafos precisavam compor o texto de um artigo de maneira inversa, com os caracteres principais empilhados de maneira sábia. Portanto, no momento da impressão, as letras seriam diretamente sobre o papel. Todas as tipografias podiam ler o jornal espelhado tão rápido quanto o impresso. Portanto, as lesmas (como caracóis) e também as histórias lentas (as últimas a serem corrigidas) eram muitas no banco de espera, identificadas apenas por suas primeiras letras, principalmente o título inteiro geralmente mais legível. Algumas notícias "quentes" estavam esperando no banco, para uma possível correção de última hora (jornal da noite) antes da última montagem e impressão definitiva.

Django surgiu dos escritórios do jornal Lawrence no Kansas. Onde provavelmente ainda existe algum jargão de impressão. A-django-entusiasta - e-amigável-velho-lesma-menino-da-França.

Praveen
fonte
61

O termo 'lesma' vem do mundo da produção de jornais.

É um nome informal dado a uma história durante o processo de produção. À medida que a história segue seu caminho, do repórter beat (supondo que eles existam mais?) Até o editor e as "impressoras", esse é o nome pelo qual é referenciada, por exemplo, "Você corrigiu esses erros no campo ' a história de Kate e William? ".

Alguns sistemas (como o Django) usam a lesma como parte da URL para localizar a história, por exemplo www.mysite.com/archives/kate-and-william.

Até o próprio Stack Overflow faz isso, com o auto-referencial GEB-ish (a)/programming/427102/what-is-a-slug-in-django/427201#427201 , embora você possa substituir o slug blahblahe ele ainda o considere aceitável.

Pode até remontar antes disso, já que os roteiros tinham "slug lines" no início de cada cena, o que basicamente define o plano de fundo dessa cena (onde, quando e assim por diante). É muito semelhante, pois é um precis ou preâmbulo do que se segue.

Em uma máquina Linotype, uma lesma era uma peça de metal de uma única linha, criada a partir dos formulários de letras individuais. Ao criar uma única lesma para toda a linha, isso melhorou bastante a composição de caractere por caractere antigo.

Embora o que se segue seja pura conjectura, um significado inicial de lesma era para uma moeda falsificada (que teria que ser pressionada de alguma forma). Eu poderia imaginar que o uso fosse transformado para o termo de impressão (já que a lesma tinha que ser pressionada usando os caracteres originais) e a partir daí, passando da definição de 'peça de metal' para a definição de 'resumo da história'. A partir daí, é um pequeno passo da impressão adequada para o mundo online.


(a) "Godel Escher, Bach", de Douglas Hofstadter , que eu (pelo menos) considero uma das grandes obras intelectuais modernas. Você também deve conferir seu outro trabalho, "The Metamagical Themas".

paxdiablo
fonte
29

Slug é um termo de jornal. Uma lesma é um rótulo curto para algo, contendo apenas letras, números, sublinhados ou hífens. Eles geralmente são usados ​​em URLs. (como nos documentos do Django)

Um campo slug no Django é usado para armazenar e gerar URLs válidos para suas páginas da web criadas dinamicamente.

Assim como você adicionou essa pergunta no Stack Overflow, uma página dinâmica foi gerada e, quando você vê na barra de endereços, verá o título da pergunta com "-" no lugar dos espaços. Esse é exatamente o trabalho de um campo de lesmas.

Digite a descrição da imagem aqui

O título digitado por você era mais ou menos assim -> O que é uma "lesma" no Django?

Ao armazená-lo em um campo de lesma, torna-se "o que é uma lesma no django" (consulte o URL desta página)

Manjit Kumar
fonte
27

A partir daqui .

"Lesma" é um termo de jornal, mas o que significa aqui é o bit final da URL. Por exemplo, um post com o título “Um pouco sobre o Django” se tornaria “um pouco sobre o django” automaticamente (você pode, é claro, alterá-lo facilmente se não gostar da lesma gerada automaticamente).

BobbyShaftoe
fonte
18

É uma parte descritiva da URL que existe para torná-la mais descritiva, mas sem necessariamente ser exigida pelo servidor web - em O que é uma "lesma" no Django? a lesma é 'in-django-what-is-lesma', mas a lesma não é usada para determinar a página veiculada (pelo menos neste site)

Cebjyre
fonte
17

Slug é um atalho amigável para URLs para conteúdo específico. Ele contém apenas letras, números, sublinhados ou hífens. As lesmas geralmente são salvas com o respectivo conteúdo e passam como uma string de URL.

Slug pode criar usando SlugField

Ex:

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

Se você quiser usar o título como slug, o django possui uma função simples chamada 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 precisar de exclusividade, adicione unique=True no campo slug.

por exemplo, do exemplo anterior:

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

Você está com preguiça de fazer processo de lesma? não se preocupe, este plugin irá ajudá-lo. django-autoslug

Simplans
fonte
8

Também slug automático no django-admin. Adicionado no ModelAdmin:

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

Como aqui:

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

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