Co to jest @permalink
i get_absolute_url
w Django? Kiedy i dlaczego? go używać?Co to jest @permalink i get_absolute_url w Django?
Bardzo prosty przykład (praktyczny przykład). Dzięki
Co to jest @permalink
i get_absolute_url
w Django? Kiedy i dlaczego? go używać?Co to jest @permalink i get_absolute_url w Django?
Bardzo prosty przykład (praktyczny przykład). Dzięki
@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")
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'),
w Django 2.0, 'reverse' powinny być importowane z' django.urls', albo dostaniesz 'ModuleNotFoundError'. – cjohnson318
dzięki - zaktualizuję –