Một con sên con vẹt trong Django là gì?


589

Khi tôi đọc mã Django, tôi thường thấy trong các mô hình cái được gọi là "sên". Tôi không chắc chắn đây là cái gì, nhưng tôi biết nó có liên quan đến URL. Làm thế nào và khi nào thì cái sên này được sử dụng?

(Tôi đã đọc định nghĩa của nó trong bảng thuật ngữ này .)

Câu trả lời:


752

"Sên" là cách tạo URL hợp lệ, thường sử dụng dữ liệu đã thu được. Chẳng hạn, một con sên sử dụng tiêu đề của một bài viết để tạo URL. Tôi khuyên bạn nên tạo sên bằng một hàm, được đặt tiêu đề (hoặc một phần dữ liệu khác), thay vì đặt thủ công.

Một ví dụ:

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

Bây giờ hãy giả vờ rằng chúng ta có một mô hình Django như:

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

Làm thế nào bạn có thể tham chiếu đối tượng này với một URL và với một tên có ý nghĩa? Chẳng hạn, bạn có thể sử dụng Article.id để URL trông như thế này:

www.example.com/article/23

Hoặc, bạn có thể muốn tham khảo tiêu đề như thế này:

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

Vì các khoảng trắng không hợp lệ trong các URL, chúng phải được thay thế bằng %20, dẫn đến:

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

Cả hai lần thử đều không dẫn đến URL rất dễ đọc, có ý nghĩa. Điều này tốt hơn:

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

Trong ví dụ này, the-46-year-old-virginlà một con sên: nó được tạo ra từ tiêu đề bằng cách đặt xuống tất cả các chữ cái và thay thế khoảng trắng bằng dấu gạch nối -.

Cũng xem URL của trang web này cho một ví dụ khác.


72
Mô tả hay, nhưng để thêm: SlugField không đảm bảo tính duy nhất ra khỏi hộp, vì vậy nếu sử dụng theo mặc định, đây là một URL tốt hơn: www.example.com/article/the-40-year-old-virgin/23 / Trong đó '23' là article.id và là những gì thực sự được sử dụng để thực hiện truy vấn (cũng nhanh hơn truy vấn trên sên).
Daniel Naab

126
Tôi thấy www.example.com/article/23/the-40-year-old-virgin dễ đọc hơn.
MiniQuark

16
Nếu bạn phục vụ nội dung dựa trên id, hãy quyết định xem liệu sên có khớp với nội dung đó không (và trả về 404 nếu không) hoặc bỏ qua hoàn toàn. Tôi không nghĩ có một quy tắc chung cho những gì tốt nhất, thông thái về SEO. SO vẫn sẽ hiển thị trang này nếu bạn nhập stackoverflow.com/questions/427102/ trên trình duyệt của bạn.
Tomas Andrle

2
@Daniel Chỉ cần lưu ý, một con sên cũng ẩn ID cơ sở dữ liệu thực, vì vậy ví dụ của bạn đánh bại một lợi thế của việc sử dụng một con sên.
Eno

15
@Eno sên được thêm cho SEO và cho permalink đẹp. ID được sử dụng để tra cứu được lập chỉ mục. SEO cho stackoverflow rất tuyệt vời - và họ sử dụng chính xác chiến lược này. Đối số của bạn là "ẩn id cơ sở dữ liệu", giờ đây bạn đã chuyển sang "SEO". Đi bằng gì
Josh Smeaton

134

Nếu tôi có thể cung cấp một số bối cảnh lịch sử:

Thuật ngữ "sên" có liên quan đến việc đúc kim loại chì chì, trong trường hợp này là ra các phông chữ báo chí được tạo ra. Mỗi tờ giấy sau đó có nhà máy phông chữ của nó thường xuyên được nấu chảy lại và đúc lại trong các khuôn mới, vì sau nhiều bản in chúng bị mòn. Những người học việc như tôi bắt đầu sự nghiệp của họ ở đó, và đã đi đến đỉnh cao (không còn nữa).

Máy in chữ phải soạn văn bản của một bài báo theo cách lạc hậu với các ký tự chính được xếp chồng lên nhau một cách khôn ngoan. Vì vậy, tại thời điểm in các chữ cái sẽ được thẳng trên giấy. Tất cả các máy đánh chữ có thể đọc báo được nhân đôi nhanh như in. Do đó, những con sên, (như ốc sên) cũng là những câu chuyện chậm chạp (cuối cùng được sửa chữa) được nhiều người chờ đợi, chỉ được xác định bằng các chữ cái nắm tay của chúng, chủ yếu là toàn bộ tiêu đề thường dễ đọc hơn. Một số tin tức "nóng" đang chờ ở đó trên băng ghế dự bị, để có thể điều chỉnh vào phút cuối, (tờ Buổi tối) trước khi lắp ráp lần cuối và in ấn dứt khoát.

Django nổi lên từ các văn phòng của tạp chí Lawrence ở Kansas. Trường hợp có lẽ một số biệt ngữ in vẫn còn lưu lại. A-django-đam mê - & - thân thiện-già-sên-trai-từ-Pháp.


61

Thuật ngữ 'sên' xuất phát từ thế giới sản xuất báo chí.

Đó là một cái tên không chính thức được đặt cho một câu chuyện trong quá trình sản xuất. Khi câu chuyện xoay quanh con đường của phóng viên beat (giả sử những điều này thậm chí còn tồn tại nữa?) Thông qua trình soạn thảo thông qua "máy in", đây là tên mà nó được tham chiếu bởi, ví dụ: "Bạn đã sửa những lỗi đó trong ' câu chuyện của kate-and-william? ".

Một số hệ thống (như Django) sử dụng sên như một phần của URL để định vị câu chuyện, một ví dụ là www.mysite.com/archives/kate-and-william.

Ngay cả Stack Overflow cũng tự làm điều này, với GEB-ish (a) tự tham chiếu /programming/427102/what-is-a-slug-in-django/427201#427201, mặc dù bạn có thể thay thế sên bằng blahblahvà nó vẫn sẽ thấy ổn.

Nó thậm chí có thể quay lại sớm hơn thế, vì các màn hình có "đường sên" ở đầu mỗi cảnh, về cơ bản đặt nền cho cảnh đó (ở đâu, khi nào, v.v.). Nó rất giống nhau ở chỗ nó là tiền đề hoặc lời mở đầu của những gì tiếp theo.

Trên máy Linotype, sên là một mảnh kim loại duy nhất được tạo ra từ các dạng chữ cái riêng lẻ. Bằng cách tạo ra một con sên duy nhất cho toàn bộ dòng, điều này đã cải thiện rất nhiều về cách kết hợp từng nhân vật cũ.

Mặc dù sau đây là phỏng đoán thuần túy, một ý nghĩa ban đầu của sên là đối với một loại tiền giả (mà sẽ phải được ép bằng cách nào đó). Tôi có thể hình dung rằng việc sử dụng được chuyển thành thuật ngữ in (vì sên phải được nhấn bằng các ký tự gốc) và từ đó, thay đổi từ định nghĩa 'mảnh kim loại' sang định nghĩa 'tóm tắt câu chuyện'. Từ đó, đó là một bước ngắn từ in ấn phù hợp đến thế giới trực tuyến.


(a) "Godel Escher, Bach", bởi một Douglas Hofstadter , mà tôi (ít nhất) coi là một trong những tác phẩm trí tuệ hiện đại vĩ đại. Bạn cũng nên xem tác phẩm khác của anh ấy, "Metamagical Themas".


29

Sên là một thuật ngữ báo chí. Sên là một nhãn ngắn cho một cái gì đó, chỉ chứa các chữ cái, số, dấu gạch dưới hoặc dấu gạch nối. Chúng thường được sử dụng trong các URL. (như trong tài liệu Django)

Trường sên trong Django được sử dụng để lưu trữ và tạo URL hợp lệ cho các trang web được tạo động của bạn.

Giống như cách bạn đã thêm câu hỏi này vào Stack Overflow và một trang động đã được tạo và khi bạn nhìn thấy trên thanh địa chỉ, bạn sẽ thấy tiêu đề câu hỏi của bạn với "-" thay cho khoảng trắng. Đó chính xác là công việc của một lĩnh vực sên.

Nhập mô tả hình ảnh ở đây

Tiêu đề mà bạn nhập vào là một cái gì đó như thế này -> Sên sên là gì trong Django?

Khi lưu trữ nó vào một trường sên, nó trở thành "what-is-a-slug-in-django" (xem URL của trang này)


27

Từ đây .

Slug Slug là một thuật ngữ báo chí, nhưng ý nghĩa của nó ở đây là bit cuối cùng của URL. Ví dụ, một bài đăng có tiêu đề, Một chút về Django, sẽ tự động trở thành, bit bit về django (tất nhiên, bạn có thể thay đổi nó một cách dễ dàng nếu bạn không thích sên tự động tạo ra).


18

Đây là một phần mô tả của URL có ở đó để làm cho nó trở nên mô tả hơn về con người, nhưng không nhất thiết phải được máy chủ web yêu cầu - trong "Sên" trong Django là gì? sên là 'in-django-what-is-a-slug', nhưng sên không được sử dụng để xác định trang được phục vụ (ít nhất là trên trang web này)


17

Slug là một nhãn ngắn thân thiện với URL cho nội dung cụ thể. Nó chỉ chứa Chữ cái, Số, Dấu gạch dưới hoặc Dấu gạch ngang. Sên thường được lưu với nội dung tương ứng và nó chuyển qua dưới dạng chuỗi URL.

Slug có thể tạo bằng SlugField

Ví dụ:

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

Nếu bạn muốn sử dụng tiêu đề như slug, django có một chức năng đơn giản gọi là slugify

from django.template.defaultfilters import slugify

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

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

Nếu nó cần sự độc đáo, thêm unique=Truevào trường sên.

ví dụ, từ ví dụ trước:

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

Bạn có lười làm quá trình sên? đừng lo lắng, plugin này sẽ giúp bạn. django-autoslug


8

Cũng tự động sên tại django-admin. Đã thêm tại ModelAdmin:

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

Như ở đây:

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

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.