9

您好我正在迁移我的应用程序以使用基于类的视图而不是基于函数的视图。在我的旧代码中,我能够以这种方式获取与函数视图相关的对象的绝对 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')

谢谢!

4

5 回答 5

24

您应该始终为您的 URL 命名,并参考:

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但更简洁一些。

于 2013-01-05T11:29:11.850 回答
12

这是我的get_absolute_url配置:

网址.py

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

模型.py

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

我的 urls.py 在“产品”应用程序下,因此 url 命名空间是“产品:产品”

于 2014-02-05T14:38:01.443 回答
3

这个问题的 2018 年答案与@Aaron 的答案基本相同,但为了快速访问,这里是:

def get_absolute_url(self):
    from django.urls import reverse
    return reverse('people.views.details', args=[str(self.id)])

来自https://docs.djangoproject.com/en/2.1/ref/models/instances/#get-absolute-url

于 2018-09-15T07:35:22.970 回答
0

这个函数对我有用,它使用多个参数:

def get_absolute_url(self):
return reverse('video', kwargs={'slug':self.chapiter.course.slug,'chpiter_slug':self.chapiter.chpiterSlug,'pk':str(self.index).zfill(2)})
于 2018-03-29T13:35:06.220 回答
0

这是您在Django >= 2.0.

urls.py

from django.urls import path

app_name = 'my_app'

urlpatterns = [
    path('products/<slug:slug>', views.ProductDetailView.as_view(), name='products')
]

将以下代码添加到您的models.py

class Product(models.Model):
    name = models.CharField(max_length=125)
    slug = models.SlugField(unique=True)
    # rest of the fields

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

要显示详细信息,请在您的views.py

class ProductDetailView(DetailView):
     template_name = 'my_app/detail.html'

     def get_queryset(self):
         return Product.objects.all()
于 2018-06-26T09:05:02.500 回答