Apa itu "siput" di Django?

589

Ketika saya membaca kode Django saya sering melihat dalam model apa yang disebut "siput". Saya tidak yakin apa ini, tapi saya tahu itu ada hubungannya dengan URL. Bagaimana dan kapan benda siput ini seharusnya digunakan?

(Saya telah membaca definisinya dalam glosarium ini .)

Jonas
sumber

Jawaban:

752

"Siput" adalah cara menghasilkan URL yang valid, umumnya menggunakan data yang sudah diperoleh. Misalnya, siput menggunakan judul artikel untuk menghasilkan URL. Saya menyarankan untuk menghasilkan siput melalui fungsi, diberi judul (atau sepotong data), daripada mengaturnya secara manual.

Sebuah contoh:

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

Sekarang mari kita berpura-pura bahwa kita memiliki model Django seperti:

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

Bagaimana Anda mereferensikan objek ini dengan URL dan dengan nama yang bermakna? Misalnya Anda bisa menggunakan Article.id sehingga URL akan terlihat seperti ini:

www.example.com/article/23

Atau, Anda mungkin ingin merujuk judul seperti ini:

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

Karena spasi tidak valid dalam URL, mereka harus diganti dengan %20, yang menghasilkan:

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

Kedua upaya tersebut tidak menghasilkan URL yang sangat bermakna dan mudah dibaca. Ini lebih baik:

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

Dalam contoh ini, the-46-year-old-virginadalah siput: itu dibuat dari judul dengan huruf kecil semua huruf, dan mengganti spasi dengan tanda hubung -.

Lihat juga URL halaman web ini untuk contoh lainnya.

Josh Smeaton
sumber
72
Deskripsi yang bagus, tetapi untuk menambahkan: SlugField tidak memastikan keunikan, jadi jika menggunakannya secara default, ini adalah URL yang lebih baik: www.example.com/article/the-40-year-old-virgin/23 / Di mana '23' adalah article.id, dan apa yang sebenarnya digunakan untuk melakukan kueri (juga lebih cepat daripada kueri pada siput).
Daniel Naab
126
Saya menemukan www.example.com/article/23/the-40-year-old-virgin lebih mudah dibaca.
MiniQuark
16
Jika Anda menyajikan konten berdasarkan id, memutuskan apakah akan memeriksa apakah siput cocok dengan konten (dan mengembalikan 404 jika tidak) atau mengabaikannya sepenuhnya. Saya tidak berpikir ada aturan umum untuk yang terbaik, SEO-bijaksana. SO akan tetap menampilkan halaman ini jika Anda memasukkan stackoverflow.com/questions/427102/… di browser Anda.
Tomas Andrle
2
@Aniel Ingatlah, siput juga menyembunyikan ID basis data yang sebenarnya, jadi contoh Anda mengalahkan satu keuntungan menggunakan siput.
Eno
15
@ Tidak ada siput yang ditambahkan untuk SEO dan untuk permalink kebaikan. ID digunakan untuk pencarian yang diindeks. SEO untuk stackoverflow sangat brilian - dan mereka menggunakan strategi ini dengan tepat. Argumen Anda adalah "sembunyikan id basis data", yang kini Anda ubah menjadi "SEO". Apa yang terjadi?
Josh Smeaton
134

Jika saya dapat memberikan beberapa konteks sejarah:

Istilah "siput" berkaitan dengan casting logam — timah, dalam hal ini — dari mana font pers dibuat. Setiap kertas kemudian memiliki pabrik font-nya yang secara teratur dicairkan kembali dan dicetak ulang dalam cetakan baru, karena setelah banyak cetakan mereka menjadi usang. Peserta magang seperti saya memulai karir mereka di sana, dan pergi ke puncak (tidak lagi).

Tipografi harus menyusun teks artikel dengan cara terbalik dengan karakter utama ditumpuk dengan bijaksana. Jadi pada saat mencetak surat-surat akan lurus di atas kertas. Semua tipografi dapat membaca koran mencerminkan secepat yang dicetak. Oleh karena itu siput, (seperti siput) juga cerita lambat (yang paling terakhir diperbaiki) ada di bangku menunggu, semata-mata diidentifikasi oleh surat kepalan tangan mereka, sebagian besar seluruh judul umumnya lebih mudah dibaca. Beberapa berita "panas" menunggu di sana di bangku, untuk kemungkinan koreksi menit terakhir, (Kertas malam) sebelum perakitan terakhir dan pencetakan definitif.

Django muncul dari kantor jurnal Lawrence di Kansas. Di mana mungkin beberapa jargon pencetakan masih hidup. Penggila django - & - ramah-siput-bocah-tua-dari-Prancis

Praveen
sumber
61

Istilah 'siput' berasal dari dunia produksi surat kabar.

Itu nama informal yang diberikan pada sebuah cerita selama proses produksi. Ketika kisah ini dimulai dari reporter beat (dengan asumsi ini bahkan ada lagi?) Hingga editor melalui "percetakan", ini adalah nama yang dirujuk oleh, misalnya, "Apakah Anda memperbaiki kesalahan-kesalahan di ' cerita kate-dan-william? ".

Beberapa sistem (seperti Django) menggunakan siput sebagai bagian dari URL untuk menemukan cerita, contohnya adalah www.mysite.com/archives/kate-and-william.

Bahkan Stack Overflow sendiri melakukan ini, dengan GEB-ish (a) referensial-sendiri /programming/427102/what-is-a-slug-in-django/427201#427201, meskipun Anda dapat mengganti siput dengan blahblahdan masih akan menemukannya baik-baik saja.

Bahkan mungkin tanggal kembali lebih awal dari itu, karena skenario memiliki "garis siput" pada awal setiap adegan, yang pada dasarnya menetapkan latar belakang untuk adegan itu (di mana, kapan, dan sebagainya). Ini sangat mirip karena merupakan prasyarat atau pembukaan dari apa yang mengikuti.

Pada mesin Linotype, siput adalah sepotong garis logam yang dibuat dari masing-masing bentuk huruf. Dengan membuat siput tunggal untuk seluruh baris, ini sangat meningkat pada pengomposisian karakter per karakter yang lama.

Meskipun yang berikut adalah dugaan murni, makna awal siput adalah untuk koin palsu (yang harus ditekan entah bagaimana). Saya bisa membayangkan bahwa penggunaan diubah menjadi istilah pencetakan (karena siput harus ditekan menggunakan karakter asli) dan dari sana, berubah dari definisi 'sepotong logam' ke definisi 'ringkasan cerita'. Dari sana, ini adalah langkah singkat dari pencetakan yang tepat ke dunia online.


(a) "Godel Escher, Bach", oleh seorang Douglas Hofstadter , yang saya (setidaknya) anggap sebagai salah satu karya intelektual modern besar. Anda juga harus memeriksa karyanya yang lain, "Thema Metamagis".

paxdiablo
sumber
29

Slug adalah istilah surat kabar. Siput adalah label pendek untuk sesuatu, hanya berisi huruf, angka, garis bawah atau tanda hubung. Mereka umumnya digunakan dalam URL. (seperti dalam dokumen Django)

Bidang siput di Django digunakan untuk menyimpan dan menghasilkan URL yang valid untuk halaman web Anda yang dibuat secara dinamis.

Sama seperti cara Anda menambahkan pertanyaan ini pada Stack Overflow dan halaman dinamis dihasilkan dan ketika Anda melihat di bilah alamat Anda akan melihat judul pertanyaan Anda dengan "-" sebagai ganti spasi. Itulah pekerjaan lapangan siput.

Masukkan deskripsi gambar di sini

Judul yang Anda masukkan kira-kira seperti ini -> Apa itu "siput" di Django?

Saat menyimpannya ke dalam bidang siput, ia menjadi "apa-apa-yang-siput-dalam-django" (lihat URL halaman ini)

Manjit Kumar
sumber
27

Dari sini .

"Slug" adalah istilah surat kabar, tetapi artinya di sini adalah bagian terakhir dari URL. Misalnya, sebuah tulisan dengan judul, "Sedikit tentang Django" akan menjadi, "sedikit tentang django" secara otomatis (Anda dapat, tentu saja, mengubahnya dengan mudah jika Anda tidak menyukai siput yang dibuat secara otomatis).

BobbyShaftoe
sumber
18

Ini adalah bagian deskriptif dari URL yang ada untuk membuatnya lebih deskriptif manusia, tetapi tanpa harus diminta oleh server web - di Apa itu "siput" di Django? siput adalah 'in-django-what-is-a-siput', tetapi siput tidak digunakan untuk menentukan halaman yang dilayani (setidaknya di situs ini)

Cebjyre
sumber
17

Slug adalah label pendek ramah URL untuk konten tertentu. Ini hanya berisi Surat, Angka, Garis Bawah atau Tanda Hubung. Siput biasanya disimpan dengan konten masing-masing dan dilewatkan sebagai string URL.

Slug dapat dibuat menggunakan SlugField

Ex:

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

Jika Anda ingin menggunakan judul sebagai siput, Django memiliki fungsi sederhana yang disebut slugify

from django.template.defaultfilters import slugify

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

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

Jika perlu keunikan, tambahkan unique=Truebidang siput.

misalnya, dari contoh sebelumnya:

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

Apakah Anda malas melakukan proses siput? jangan khawatir, plugin ini akan membantu Anda. Django-autoslug

Simplans
sumber
8

Juga siput otomatis di Django-admin. Ditambahkan di ModelAdmin:

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

Seperti di sini:

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

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