2013-01-05 35 views
5

你好我正在遷移我的應用程序以使用基於類的視圖,而不是基於功能的視圖。在我以前的代碼我能得到相關的功能視圖這樣的對象的絕對網址:使用基於類的視圖時在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(r'/category/(?P<slug>\w+)/$', CategoryView.as_view(), name='category_view'), 

現在:

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

注意我用的永久裝飾,它不等同於調用reverse但有點整潔。

+7

根據1.6文檔,不再推薦permalink裝飾器:https://docs.djangoproject.com/en/1.6/ref/models/instances/#the-permalink-decorator – highpost

+0

這工作甚至與Django 1.10一起工作。 – javed

6

這裏是我的get_absolute_url配置:

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

我的urls.py是根據 「產品」 的應用程序,所以url命名空間是「產品:產品」

+0

如果正則表達式不是這樣命名的: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正則表達式中命名它們非常重要。 –

相關問題