Django'da “sülük” nedir?


589

Django kodunu okuduğumda modellerde sık sık "slug" denilen şeyi görüyorum. Bunun ne olduğundan tam olarak emin değilim, ancak URL'lerle bir ilgisi olduğunu biliyorum. Bu sümüklü şey nasıl ve ne zaman kullanılacak?

(Tanımını okudum Bu sözlükte .)

Yanıtlar:


752

"Bilgi", genellikle zaten elde edilen verileri kullanarak geçerli bir URL oluşturmanın bir yoludur. Örneğin, bilgi, URL oluşturmak için makalenin başlığını kullanır. Sümüğü elle ayarlamak yerine başlık (veya başka bir veri parçası) verildiğinde bir işlev aracılığıyla oluşturmanızı öneririm.

Bir örnek:

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

Şimdi şöyle bir Django modelimiz olduğunu varsayalım:

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

Bu nesneye bir URL ve anlamlı bir adla nasıl başvurabilirsiniz? Örneğin, URL'nin şöyle görünmesi için Article.id dosyasını kullanabilirsiniz:

www.example.com/article/23

Veya başlığa şu şekilde başvurmak isteyebilirsiniz:

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

Alanlar URL'lerde geçerli olmadığından, bu sütunlar ile değiştirilmelidir %20;

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

Her iki girişim de çok anlamlı, okunması kolay URL ile sonuçlanmaz. Bu daha iyi:

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

Bu örnekte, the-46-year-old-virginbir sümüklübektir: başlıktan tüm harfleri aşağıya yazarak ve boşlukları tirelerle değiştirerek oluşturulur- .

Başka bir örnek için bu web sayfasının URL'sine de bakın.


72
İyi açıklama, ancak eklemek için: SlugField kutunun dışında benzersizlik sağlamaz, bu nedenle varsayılan olarak kullanıyorsanız, bu daha iyi bir URL'dir: www.example.com/article/the-40-year-old-virgin/23 / Burada '23', article.id'dir ve sorguyu yapmak için gerçekten kullanılan şeydir (ayrıca bilgi isteminde sorgulamaktan daha hızlıdır).
Daniel Naab

126
Www.example.com/article/23/the-40-year-old-virgin okumayı daha kolay buluyorum.
MiniQuark

16
İçeriği kimliğe göre sunuyorsanız, bilgi bilgisinin içerikle eşleşip eşleşmediğini kontrol edin (ve yoksa 404'ü döndürün) veya tamamen yok sayın. SEO açısından en iyisi için genel bir kural olduğunu düşünmüyorum. Tarayıcınıza stackoverflow.com/questions/427102/… girerseniz SO bu sayfayı görüntüleyecektir .
Tomas Andrle

2
@Daniel Unutmayın, bir sümüklü böcek gerçek veritabanı kimliğini de gizler, bu nedenle örneğin sümüklü böcek kullanmanın bir avantajını yener.
Eno

15
@ Sümüklü böcek SEO ve permalink nicey-ness için eklenir. Kimlik, dizine alınmış arama için kullanılır. Stackoverflow için SEO parlak - ve tam olarak bu stratejiyi kullanırlar. Argümanınız şu anda "SEO" ya çevirdiğiniz "veritabanı kimliğini gizle" idi. Neler oluyor?
Josh Smeaton

134

Bazı tarihsel bağlam sağlayabilirsem:

Terimi "sümüklüböcek" , baskı yazı tiplerinin yapıldığı metal döküm (bu durumda kurşun) ile ilgilidir. Daha sonra her kağıdın yazı fabrikaları düzenli olarak eritildi ve taze kalıplarda yeniden şekillendirildi, çünkü birçok baskıdan sonra yıprandılar. Benim gibi çıraklar kariyerine orada başladılar ve en üst sıraya çıktılar (artık değil).

Tipografiler, bir makalenin metnini, akıllıca yığılmış kurşun karakterler ile geriye doğru yazmalıdır. Yani baskı zamanında harfler doğrudan kağıt üzerinde olacaktır. Tüm tipografiler basılı gazeteye yansıtılan gazeteyi okuyabilirdi. Bu nedenle sümüklü böcekler (salyangozlar gibi) yavaş hikayeler de (son düzeltilecek olan) tezgahta beklerken, sadece yumruk harfleriyle tanımlanmıştı, çoğunlukla tüm başlık genellikle daha okunabilirdi. Bazı son dakika düzeltmeleri ve son baskıdan önce olası son dakika düzeltmesi (Akşam gazetesi) için bazı "sıcak" haberler orada bankta bekliyordu.

Django, Kansas'taki Lawrence dergisinin ofislerinden çıktı. Muhtemelen bazı baskı jargonu hala devam ediyor. A-Django-meraklısı - & - dost-old-sülük-boy-den-France.


61

'Sülük' terimi gazete üretimi dünyasından gelir.

Üretim sürecinde bir hikayeye verilen gayri resmi bir isim. Hikaye, ritmi muhabirinden (bunların artık var olduğu varsayılarak ) editörden "matbaalara" kadar yolunu sardığından, buna atıfta bulunulan ad, örneğin, "Bu hataları ' Kate-william'ın hikayesi? ".

Bazı sistemler (Django gibi), hikayeyi bulmak için URL'yi URL'nin bir parçası olarak kullanır www.mysite.com/archives/kate-and-william.

Stack Overflow'un kendisi bile bunu yapar, GEB-ish (a) kendi kendine referanslıdır /programming/427102/what-is-a-slug-in-django/427201#427201, ancak sülük ile değiştirebilir blahblahve yine de iyi bulacaktır.

Senaryoların her sahnenin başlangıcında "sülük çizgileri" bulunduğundan, bu sahnenin arka planını (nerede, ne zaman, vb.) Ayarladığı için daha da eski olabilir. Bunu izleyenlerin tam veya önsözü olması çok benzer.

Bir Linotype makinesinde, sülük, tek tek harf formlarından oluşturulan tek bir metal parçasıydı. Tüm satır için tek bir bilgi, eski karakter karakter bileşimlerinde büyük ölçüde gelişti.

Aşağıdakiler saf varsayım olsa da, sümüklübenin erken anlamı sahte bir madeni para içindi (bir şekilde basılması gerekir). Kullanımın baskı terimine (sümüklübenin orijinal karakterler kullanılarak basılması gerektiğinden) dönüştüğünü ve oradan 'metal parçası' tanımından 'hikaye özeti' tanımına dönüştüğünü tahmin edebilirim. Oradan, doğru baskıdan çevrimiçi dünyaya kısa bir adım.


(a) En azından büyük modern entelektüel eserlerden birini düşündüğüm bir Douglas Hofstadter tarafından "Godel Escher, Bach" . Ayrıca onun diğer eseri "Metamagical Themas" a da göz atmalısınız.


29

Slug bir gazete terimidir. Bilgi, yalnızca harf, sayı, alt çizgi veya kısa çizgi içeren bir şey için kısa bir etikettir. Genellikle URL'lerde kullanılırlar. (Django dokümanlarında olduğu gibi)

Dinamik olarak oluşturulan web sayfalarınız için geçerli URL'leri saklamak ve oluşturmak için Django'daki bilgi alanı kullanılır .

Bu soruyu Yığın Taşması'na eklediğiniz ve dinamik bir sayfa oluşturduğunuz gibi ve adres çubuğunda gördüğünüzde soru başlığınızı boşlukların yerine "-" ile görürsünüz. Bu tam bir sümüklü böcek tarlasının işi.

Resim açıklamasını buraya girin

Girdiğiniz başlık şöyleydi -> Django'da “bilgi” nedir?

Bir slug alanına depolandığında "slug-in-django" nedir (bu sayfanın URL'sine bakın)


27

Gönderen burada .

“Slug” bir gazete terimidir, ancak burada anlamı URL'nin son kısmıdır. Örneğin, “Django hakkında biraz” başlıklı bir yazı otomatik olarak “bit-hakkında-django” haline gelecektir (otomatik olarak oluşturulan slug'ı beğenmezseniz kolayca değiştirebilirsiniz).


18

URL'nin daha insan tanımlayıcı olmasını sağlamak için var olan açıklayıcı bir parçasıdır, ancak web sunucusu tarafından zorunlu olarak istenmeden - Django'da "bilgi" nedir? slug 'in-django-ne-slug' dır, ancak slug sunulan sayfayı belirlemek için kullanılmaz (en azından bu sitede)


17

Slug, belirli içerikler için URL dostu kısa bir etikettir. Yalnızca Harf, Sayı, Alt Çizgi veya Kısa Çizgi içerir. Sümüklü böcekler genellikle ilgili içerikle kaydedilir ve URL dizesi olarak geçer.

Slug, SlugField kullanarak oluşturabilir

Ör:

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

Başlığı slug olarak kullanmak istiyorsanız, django adlı basit bir işlevi vardır. slugify

from django.template.defaultfilters import slugify

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

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

Benzersiz olması gerekiyorsa, unique=True alanına .

örneğin, önceki örnekten:

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

Sülük işlemini yapmak için tembel misin? merak etmeyin, bu eklenti size yardımcı olacaktır. Django-autoslug


8

Ayrıca django-admin otomatik slug. ModelAdmin'de eklendi:

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

Buradaki gibi:

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

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.