Подтвердить что ты не робот

Что такое @permalink и get_absolute_url в Django?

Что такое @permalink и get_absolute_url в Django? Когда и зачем использовать его?

Пожалуйста, очень простой пример (настоящий практический пример). Благодаря

4b9b3361

Ответ 1

@permalink - это декоратор, а get_absolute_url - метод для модели django.

И то, и другое касается разрешения перевернуть URL для определенного объекта и должно использоваться вместе. Они используются в любое время, когда вам нужно предоставить ссылку на конкретный объект или показать пользователю определенный URL-адрес этого объекта (если он есть)

Вы можете просто написать свой метод get_absolute_url, чтобы вернуть жестко закодированную строку, но это не будет соответствовать философии Django относительно DRY (не повторяйте себя). Вместо этого есть @permalink, чтобы сделать вещи более гибкими.

Если вы прочитаете документы по теме, вы увидите, как они связаны друг с другом. декоратор @permalink подключается к бэкэнду django URLconf, позволяя писать гораздо более переносимый код с помощью шаблонов именованных URL. Это предпочтительнее, чем просто использовать get_absolute_url: ваш код становится намного СУХИМ, так как вам не нужно указывать пути.

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

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

и в urls.py

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

Ответ 2

С 2013 года документация Django не поощряла использование декоратора постоянных ссылок и поощряла использование reverse() в теле метода get_absolute_url. К 2015 году декоратор постоянной ссылки, казалось, исчез без следа из документации Django, и он был окончательно удален в версии 2.1 Django в 2018 году.

Таким образом, для стандартного способа СУХОГО создать постоянную ссылку на один объектный вид используйте get_absolute_url() в вашей модели, например, так:

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

а затем есть запись в urls.py, которая указывает на ваш взгляд:

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

Ответ 3

  в Джанго 2.1 Декоратор django.db.models.permalink() удален.

источник