43

Django の@permalinkand とは何ですか? get_absolute_urlいつ、なぜそれを使用するのですか?

非常に単純な例 (実際の実際の例) をお願いします。ありがとう

4

4 に答える 4

93

2013 年現在、Django のドキュメントではパーマリンク デコレータの使用を推奨せず、get_absolute_url メソッドの本体で reverse() の使用を推奨しています。2015 年までに、パーマリンク デコレータはDjango ドキュメントから跡形もなく消えたように見え、2018 年の Django バージョン 2.1 で最終的に削除されました。

したがって、単一のオブジェクト ビューへの永続的なリンクを作成する標準的な DRY 方法については、次のようにモデルで 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'),
于 2013-05-01T16:49:38.147 に答える
39

@permalinkは python decoratorであり、get_absolute_urlは django モデルのメソッドです。

両方とも、特定のオブジェクトの URL を反転できるようにすることに関係しているため、一緒に使用する必要があります。これらは、特定のオブジェクトへのリンクを提供する必要があるとき、またはそのオブジェクトの特定の URL (ある場合) をユーザーに表示する必要があるときにいつでも使用されます。

ハードコードされた文字列を返すメソッドを単純に書くこともできますget_absolute_urlが、これは Django の DRY の哲学に準拠していません (同じことを繰り返さないでください)。代わりに、@permalink物事をより柔軟にするためのものがあります。

この件に関するドキュメントを読むと、それらが互いにどのように関係しているかがわかります。デコレータはdjango の URLconf のバックエンドにフックし、名前付きの URL パターン@permalinkを使用して、より移植性の高いコードを記述できるようにします。これは、単独で使用するよりも望ましい方法です。パスを指定する必要がないため、コードはより DRYer になります。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")
于 2012-11-21T23:54:11.890 に答える