"กระสุน" ใน Django คืออะไร


588

เมื่อฉันอ่านรหัส Django ฉันมักจะเห็นในรูปแบบสิ่งที่เรียกว่า "กระสุน" ฉันไม่แน่ใจว่าสิ่งนี้คืออะไร แต่ฉันรู้ว่ามันเกี่ยวข้องกับ URL กระสุนนี้ควรจะใช้อย่างไรและเมื่อไหร่?

(ฉันได้อ่านคำจำกัดความในอภิธานศัพท์นี้แล้ว)

คำตอบ:


752

"กระสุน" เป็นวิธีการสร้าง URL ที่ถูกต้องโดยทั่วไปใช้ข้อมูลที่ได้รับแล้ว ตัวอย่างเช่นตัวบุ้งใช้ชื่อเรื่องของบทความเพื่อสร้าง URL ฉันแนะนำให้สร้างกระสุนโดยใช้ฟังก์ชั่นกำหนดชื่อ (หรือข้อมูลอื่น) แทนที่จะตั้งค่าด้วยตนเอง

ตัวอย่าง:

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

ตอนนี้ลองทำเป็นว่าเรามีโมเดล Django เช่น:

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

คุณจะอ้างอิงวัตถุนี้ด้วย URL และชื่อที่มีความหมายได้อย่างไร ตัวอย่างเช่นคุณสามารถใช้ Article.id ดังนั้น URL จะเป็นดังนี้:

www.example.com/article/23

หรือคุณอาจต้องการอ้างอิงชื่อเรื่องเช่นนี้:

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

เนื่องจากการเว้นวรรคไม่ถูกต้องใน URL จึงต้องทำการแทนที่ด้วย%20ซึ่งส่งผลให้:

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

ความพยายามทั้งสองไม่ได้ส่งผลให้มีความหมายและง่ายต่อการอ่าน URL สิ่งนี้ดีกว่า:

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

ในตัวอย่างนี้the-46-year-old-virginเป็นกระสุน: -มันถูกสร้างขึ้นจากชื่อโดยลงท่อทุกตัวอักษรและแทนที่ช่องว่างโดยยัติภังค์

ดู URL ของหน้าเว็บนี้เป็นอีกตัวอย่างหนึ่ง


72
คำอธิบายที่ดี แต่เพื่อเพิ่ม: SlugField ไม่ได้รับประกันความเป็นเอกลักษณ์นอกกรอบดังนั้นหากใช้โดยค่าเริ่มต้นนี่เป็น URL ที่ดีกว่า: www.example.com/article/the-40-year-old-virgin/23 / ที่ไหน '23' เป็นบทความ. และเป็นสิ่งที่ใช้จริงในการทำแบบสอบถาม (ยังเร็วกว่าแบบสอบถามบนกระสุน)
Daniel Naab

126
ฉันพบ www.example.com/article/23/the-40-year-old-virgin อ่านง่ายขึ้น
MiniQuark

16
หากคุณให้บริการเนื้อหาตามรหัสให้ตัดสินใจว่าจะตรวจสอบว่ากระสุนตรงกับเนื้อหา (และส่งคืน 404 หากไม่เป็นเช่นนั้น) หรือไม่สนใจเลย ฉันไม่คิดว่ามีกฎทั่วไปสำหรับสิ่งที่ดีที่สุด SEO ฉลาด ดังนั้นจะยังคงแสดงหน้านี้หากคุณป้อนstackoverflow.com/questions/427102/…ในเบราว์เซอร์ของคุณ
Tomas Andrle

2
@Daniel โปรดจำไว้ว่ากระสุนยังซ่อน ID ฐานข้อมูลจริงดังนั้นตัวอย่างของคุณจะเอาชนะข้อได้เปรียบอย่างหนึ่งของการใช้กระสุน
Eno

15
@ ไม่มีตัวบุ้งถูกเพิ่มเข้ามาสำหรับ SEO และเพื่อความคิดเห็นที่ดี ID ใช้สำหรับการค้นหาที่จัดทำดัชนี SEO สำหรับ stackoverflow นั้นยอดเยี่ยม - และพวกเขาใช้กลยุทธ์นี้อย่างแท้จริง อาร์กิวเมนต์ของคุณคือ "ซ่อนรหัสฐานข้อมูล" ซึ่งคุณได้เปลี่ยนเป็น "SEO" แล้ว ไปไหน
Josh Smeaton

134

หากฉันอาจให้บริบททางประวัติศาสตร์บางอย่าง:

คำว่า"กระสุน"เกี่ยวข้องกับการหล่อโลหะ - ตะกั่วในกรณีนี้ - ซึ่งเป็นแบบอักษรที่กด กระดาษทุกแผ่นจะมีโรงงานแบบอักษรของมันซ้ำแล้วซ้ำอีกและหล่อใหม่ในแม่พิมพ์ใหม่เนื่องจากหลังจากพิมพ์ออกมาหลายแผ่น ผู้ฝึกหัดอย่างฉันเริ่มต้นอาชีพของพวกเขาที่นั่นและไปจนถึงจุดสูงสุด (ไม่ใช่อีกต่อไป)

แบบอักษรต้องเขียนข้อความของบทความในลักษณะย้อนหลังด้วยตัวอักษรนำซ้อนกันในฉลาด ดังนั้นเวลาพิมพ์ตัวอักษรจะตรงไปบนกระดาษ นักพิมพ์ทุกคนสามารถอ่านหนังสือพิมพ์ที่มิเรอร์ได้เร็วที่สุดเท่าที่พิมพ์ ดังนั้นทาก (เช่นหอยทาก) และเรื่องราวช้า ๆ (สุดท้ายจะได้รับการแก้ไข) มีจำนวนมากบนม้านั่งรอโดยระบุเพียงจดหมายกำปั้นของพวกเขาส่วนใหญ่ทั้งชื่อมักอ่านง่าย มีข่าว "ร้อนแรง" รออยู่บนม้านั่งเพื่อแก้ไขในนาทีสุดท้าย (กระดาษเย็น) ก่อนการประชุมครั้งสุดท้ายและการพิมพ์ขั้นสุดท้าย

Django โผล่ออกมาจากสำนักงานวารสารลอเรนซ์ในแคนซัส อาจมีศัพท์แสงการพิมพ์บางอย่างที่ยังคงสะท้อนอยู่ A-Django กระตือรือร้น - & - มิตรเก่ากระสุน-boy จากฝรั่งเศส


61

คำว่า 'กระสุน' มาจากโลกของการผลิตหนังสือพิมพ์

มันเป็นชื่อที่ไม่เป็นทางการที่มอบให้กับเรื่องราวในระหว่างกระบวนการผลิต ในขณะที่เนื้อเรื่องของลมออกมาจากจังหวะของนักข่าว (สมมติว่าสิ่งเหล่านี้มีอยู่อีกต่อไป?) ผ่านไปยังบรรณาธิการผ่านไปยัง "แท่นพิมพ์" นี่คือชื่อที่ถูกอ้างอิงโดยเช่น "คุณแก้ไขข้อผิดพลาดเหล่านั้นใน ' เรื่องราวของเคท - วิลเลียม? "

บางระบบ (เช่น Django) ใช้กระสุนเป็นส่วนหนึ่งของ URL www.mysite.com/archives/kate-and-williamที่จะค้นหาเรื่องที่เป็นตัวอย่าง

แม้แต่ Stack Overflow ก็ทำเช่นนี้ด้วย GEB-ish (a)การอ้างอิงตนเอง/programming/427102/what-is-a-slug-in-django/427201#427201แม้ว่าคุณจะสามารถแทนที่กระสุนด้วยblahblahและมันจะยังคงพบว่าไม่เป็นไร

มันอาจย้อนกลับไปเร็วกว่านั้นเนื่องจากบทภาพยนตร์มี "เส้นกระสุน" ในตอนเริ่มต้นของแต่ละฉากซึ่งโดยทั่วไปจะกำหนดฉากหลังให้กับฉากนั้น มันคล้ายกันมากกับสิ่งที่ว่าเป็นสิ่งที่นำเสนอหรือคำนำของสิ่งที่ตามมา

บนเครื่อง Linotype กระสุนเป็นชิ้นเดียวของโลหะที่สร้างขึ้นจากรูปแบบตัวอักษรของแต่ละบุคคล ด้วยการสร้างกระสุนเดี่ยวสำหรับทั้งเส้นสิ่งนี้ได้รับการปรับปรุงอย่างมากในการแต่งเพลงแบบตัวละครต่อตัวละคร

แม้ว่าสิ่งต่อไปนี้เป็นการคาดเดาที่บริสุทธิ์ทว่าความหมายแรกของทากคือเหรียญปลอม (ซึ่งจะต้องกดลงไป) ฉันสามารถจินตนาการได้ว่าการใช้งานถูกเปลี่ยนเป็นคำที่พิมพ์ (เนื่องจากกระสุนต้องถูกกดโดยใช้ตัวอักษรดั้งเดิม) และจากนั้นเปลี่ยนจากคำจำกัดความ 'ชิ้นส่วนของโลหะ' เป็นคำจำกัดความ 'สรุปเรื่องราว' จากตรงนั้นมันเป็นขั้นตอนสั้น ๆ จากการพิมพ์ที่เหมาะสมสู่โลกออนไลน์


(a) "Godel Escher, Bach" โดยDouglas Hofstadterหนึ่งคนซึ่งฉัน (อย่างน้อย) พิจารณาหนึ่งในผลงานทางปัญญาที่ยิ่งใหญ่สมัยใหม่ คุณควรตรวจสอบงานอื่น ๆ ของเขา "Metamagical Themas"


29

Slug เป็นคำในหนังสือพิมพ์ กระสุนเป็นฉลากสั้น ๆ สำหรับบางสิ่งซึ่งประกอบด้วยตัวอักษรตัวเลขเครื่องหมายขีดล่างหรือเครื่องหมายขีดกลางเท่านั้น โดยทั่วไปจะใช้ใน URL (เหมือนใน Django docs)

ฟิลด์กระสุนใน Django ใช้เพื่อจัดเก็บและสร้างURL ที่ถูกต้องสำหรับหน้าเว็บที่คุณสร้างขึ้นแบบไดนามิก

เช่นเดียวกับที่คุณเพิ่มคำถามนี้ใน Stack Overflow และมีการสร้างหน้าแบบไดนามิกและเมื่อคุณเห็นในแถบที่อยู่คุณจะเห็นชื่อคำถามของคุณด้วย "-" แทนที่ช่องว่าง นั่นเป็นหน้าที่ของเขตข้อมูลกระสุนอย่างแน่นอน

ป้อนคำอธิบายภาพที่นี่

ชื่อที่คุณป้อนเป็นอย่างนี้ -> อะไรคือ“ กระสุน” ใน Django

ในการจัดเก็บลงในช่องกระสุนมันจะกลายเป็น "what-is-a-slug-in-django" (ดู URL ของหน้านี้)


27

จากที่นี่

“ Slug” เป็นคำศัพท์ในหนังสือพิมพ์ แต่ความหมายของที่นี่คือส่วนสุดท้ายของ URL ตัวอย่างเช่นโพสต์ที่มีชื่อ“ บิตเกี่ยวกับ Django” จะกลายเป็น“ บิตเกี่ยวกับ django” โดยอัตโนมัติ (แน่นอนคุณสามารถเปลี่ยนได้อย่างง่ายดายหากคุณไม่ชอบกระสุนที่สร้างขึ้นโดยอัตโนมัติ)


18

เป็นส่วนอธิบายของ URL ที่มีเพื่อให้เป็นคำอธิบายที่เป็นมนุษย์มากขึ้น แต่ไม่จำเป็นต้องมีเว็บเซิร์ฟเวอร์ - ใน"กระสุน" ใน Django คืออะไร? กระสุนคือ 'in-django-what-is-a-slug' แต่กระสุนไม่ได้ถูกใช้เพื่อกำหนดหน้าที่ให้บริการ (บนเว็บไซต์นี้อย่างน้อย)


17

Slug เป็นป้ายกำกับย่อ URL ที่เป็นมิตรสำหรับเนื้อหาที่เฉพาะเจาะจง มันมีเพียงตัวอักษรตัวเลขขีดล่างหรือยัติภังค์ ตัวบุ้งมักจะบันทึกด้วยเนื้อหาที่เกี่ยวข้องและมันจะผ่านเป็นสตริง URL

กระสุนสามารถสร้างโดยใช้ SlugField

Ex:

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

ถ้าคุณต้องการใช้หัวเรื่องเป็นกระสุน, django มีฟังก์ชันง่าย ๆ ที่เรียกว่า slugify

from django.template.defaultfilters import slugify

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

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

หากต้องการความเป็นเอกลักษณ์ให้เพิ่มunique=Trueในช่องกระสุน

ตัวอย่างเช่นจากตัวอย่างก่อนหน้านี้:

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

คุณขี้เกียจที่จะทำกระบวนการกระสุนหรือไม่ ไม่ต้องกังวลปลั๊กอินนี้จะช่วยคุณ Django-autoslug


8

กระสุนอัตโนมัติที่ django-admin เพิ่มที่ ModelAdmin:

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

ตามที่นี่:

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

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

4

กระสุน

ป้ายกำกับสั้น ๆ สำหรับบางสิ่งที่ประกอบด้วยตัวอักษรตัวเลขเครื่องหมายขีดล่างหรือเครื่องหมายขีดกลาง โดยทั่วไปจะใช้ใน URL ตัวอย่างเช่นใน URL รายการบล็อกทั่วไป:

https://www.djangoproject.com/weblog/2008/apr/12/spring/ บิตสุดท้าย (สปริง) คือกระสุน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.