2012-11-21 8 views

Odpowiedz

31

@permalink to pyton decorator, natomiast get_absolute_url jest sposobem na modelu Django.

Obie mają na celu umożliwienie odwrócenia adresu URL dla określonego obiektu i powinny być używane razem. Są one używane w dowolnym momencie, gdy trzeba podać łącze do określonego obiektu lub wyświetlić specyficzny adres URL tego obiektu (jeśli go posiada) do użytkownika:

Możesz po prostu napisać swoją metodę get_absolute_url, aby zwrócić sztywno zakodowany ciąg, ale nie byłoby to zgodne z filozofią DRY Django (nie powtarzaj się). Zamiast tego jest @permalink, aby zwiększyć elastyczność.

Po przeczytaniu the docs on the subject zobaczysz, jak się ze sobą wiążą. dekorator @permalink łączy się z backendem Django w URLconf, co pozwala napisać znacznie bardziej przenośny kod za pomocą named url patterns. Jest to lepsze rozwiązanie niż samo używanie get_absolute_url: Twój kod staje się dużo bardziej DRYER, ponieważ nie musisz określać ścieżek.

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

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

i urls.py

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

W 2013 roku, w dokumentacji Django zniechęcać zastosowanie dekoratora niego i zachęca zastosowania odwróconych() w korpusie metodą get_absolute_url. Jednak od 2015 r. Wydaje się, że dekorator permalink miał zniknął bez śladu z dokumentacji Django, więc możemy spokojnie założyć, że został przestarzały.

Więc dla standardowego DRY sposób utworzyć stały link do widoku pojedynczego obiektu, należy get_absolute_url() w modelu tak:

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,)) 

a następnie mieć wpis w urls.py że punkty do widzenia:

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

w Django 2.0, 'reverse' powinny być importowane z' django.urls', albo dostaniesz 'ModuleNotFoundError'. – cjohnson318

+0

dzięki - zaktualizuję –