2012-11-21 23 views

Trả lời

31

@permalink là một con trăn decorator, trong khi get_absolute_url là phương pháp trên mô hình django.

Cả hai đều quan tâm đến việc cho phép bạn đảo ngược URL cho một đối tượng cụ thể và nên được sử dụng cùng nhau. Chúng được sử dụng bất cứ lúc nào bạn cần cung cấp liên kết đến một đối tượng cụ thể hoặc muốn hiển thị URL cụ thể của đối tượng đó (nếu có) cho người dùng

Bạn có thể chỉ cần viết phương thức get_absolute_url của mình để trả về chuỗi mã hóa cứng, nhưng điều này sẽ không tuân theo triết lý DRAG của Django (đừng lặp lại chính mình). Thay vào đó, có @permalink để làm cho mọi thứ linh hoạt hơn.

Nếu bạn đọc the docs on the subject, bạn sẽ thấy chúng có liên quan như thế nào với nhau. các @permalink móc trang trí vào phần phụ trợ của trình duyệt URL của Django, cho phép bạn viết nhiều mã di động hơn bằng cách sử dụng named url patterns. Điều này là thích hợp hơn để chỉ sử dụng get_absolute_url trên chính nó: mã của bạn trở nên nhiều DRYer vì bạn không phải chỉ định đường dẫn.

class BlogPost(models.Model): 
    name = modelsCharField() 
    slug = models.SlugField(...) 

    @permalink 
    def get_absolute_url(self): 
     return ("blog-detail", [self.slug,]) 

và trong urls.py

... 
    url(r'/blog/(?P<slug>[-w]+)/$', blog.views.blog_detail, name="blog-detail") 
65

Tính đến năm 2013, các tài liệu Django nản chí sử dụng các trang trí permalink và khuyến khích sử dụng ngược() trong cơ thể của phương pháp get_absolute_url. Nhưng đến năm 2015, trang trí nội thất có vẻ như đã bị biến mất mà không có dấu vết từ tài liệu Django, vì vậy chúng tôi có thể giả định rằng nó đã không được chấp nhận một cách an toàn.

Vì vậy, một cách DRY tiêu chuẩn để tạo ra một liên kết vĩnh viễn cho một cái nhìn đối tượng duy nhất, sử dụng get_absolute_url() trong mô hình của bạn như thế này:

from django.db import models 
from django.urls import reverse 
# NOTE: pre Django 1.10+ this is "from django.core.urlresolvers import reverse" 


class MyModel(models.Model): 
    slug = models.SlugField() 

    def get_absolute_url(self): 
     return reverse('mymodel_detail', args=(self.slug,)) 

và sau đó có một mục trong urls.py rằng điểm cho chế độ xem của bạn:

url(r'^(?P<slug>[-\w\d\_]+)/$', 
    MyModelDetailView.as_view(), 
    name='mymodel_detail'), 
+1

Trong Django 2.0, 'reverse' sẽ được nhập từ' django.urls' hoặc bạn sẽ nhận được 'ModuleNotFoundError'. – cjohnson318

+0

cảm ơn - Tôi sẽ cập nhật –

Các vấn đề liên quan