2013-01-05 9 views
5

こんにちは私は、関数ベースのビューの代わりにクラスベースのビューを使用するように私のアプリを移行しています。私は私が得るために私のGET絶対URL機能に変更すべきかを見つけることができませんでしたクラスベースのビューを使用するときにDjangoで絶対URLを取得

class Category(models.Model): 
    name = models.CharField(max_length=100,unique=True) 
    slug = models.SlugField(unique=True) 
    description = models.TextField() 
    parent = models.ForeignKey('self',null=True,blank=True) 

    def get_absolute_url(self): 
     return reverse('blog.views.showcategory',args=[str(self.slug)]) 

:私の古いコードでは、私はこの方法で機能ビューに関連するオブジェクトの絶対URLを取得することができました同じ結果。

これは

class CategoryView(ListPosts): 
    template_name = "postlist.html" 
    context_object_name="posts" 
    def get_queryset(self): 
     return Post.objects.filter(category__slug=self.kwargs['slug']).order_by('created') 

おかげで私の新しいクラスベースのビューです!

+1

urlconfの適切な行はどのようなものですか?そして、Djangoはあなたにどんなエラーを投げますか? –

答えて

19

あなたは常にあなたのURLの名前を与え、そしてそれに参照する必要があります。

url(r'/category/(?P<slug>\w+)/$', CategoryView.as_view(), name='category_view'), 

:私はreverseを呼び出した場合と同じ処理を行いパーマリンクデコレータを使用しました

@models.permalink 
def get_absolute_url(self): 
    return ('category_view',(), {'slug': self.slug}) 

注意をしかし、少しきついです。私urls.pyは、 "製品" のアプリの下にある

urls.py

urlpatterns = patterns('', 
    url(r'^products/(?P<slug>[\w\d\-\_]+)/$', views.ProductView.as_view(), name='product'), 
    ) 

models.py

def get_absolute_url(self): 
    return reverse('products:product', kwargs={'slug':self.slug}) 

:ここ

+7

1.6ドキュメントによれば、パーマリンクデコレータはもはやお勧めしません。https://docs.djangoproject.com/en/1.6/ref/models/instances/#the-permalink-decorator – highpost

+0

これはdjango 1.10でも動作しました。 – javed

6

は私get_absolute_url構成ですしたがって、URLの名前空間は「products:product」です

+0

regexpの名前が次のように指定されていない場合:url(r '^ products /([\ w \ d \ - \ _] +)/ $'、views.ProductView.as_view()、name = 'product') 、 )どのようにパラメータkwargsを注入するのですか? kwargs = self.slugは機能しません。 – Reveclair

+0

@Reveclair 'kwargs'はキーワード引数の辞書なので、' self.slug'と同じように設定したくありません。他のPython辞書と同様に、 'kwargs'にパラメータを注入することができます。すなわち 'kwargs ['foo'] = 'bar''です。さらに、Djangoでは、名前付きのURLパラメータだけが 'kwargs'に注入されるので、URL正規表現で名前を付けることが重要です。 –

関連する問題