使用基于类的视图时,在Django中获取绝对URL

Aym*_*hat 8 python 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)])
Run Code Online (Sandbox Code Playgroud)

我无法在我的获取绝对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')
Run Code Online (Sandbox Code Playgroud)

谢谢!

Dan*_*man 21

您应始终为您的网址命名,并参考:

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

现在:

@models.permalink
def get_absolute_url(self):
    return ('category_view', (), {'slug': self.slug})
Run Code Online (Sandbox Code Playgroud)

注意我已经使用了永久链接装饰器,它与调用相同,reverse但有点整洁.

  • 根据1.6文档,不再推荐永久链接装饰器:https://docs.djangoproject.com/en/1.6/ref/models/instances/#the-permalink-decorator (8认同)
  • 根据django docs,您需要使用`reverse()` https://docs.djangoproject.com/en/2.1/ref/models/instances/#get-absolute-url (2认同)

Aar*_*ier 9

这是我的get_absolute_url配置:

urls.py

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

models.py

def get_absolute_url(self):
    return reverse('products:product', kwargs={'slug':self.slug})
Run Code Online (Sandbox Code Playgroud)

我的urls.py位于"products"应用程序下,因此url名称空间为"products:product"