您好我正在迁移我的应用程序以使用基于类的视图而不是基于函数的视图。在我的旧代码中,我能够以这种方式获取与函数视图相关的对象的绝对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')
谢谢!
答案 0 :(得分:20)
您应始终为您的网址命名,并参考:
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
一样,但是有点整洁。
答案 1 :(得分:9)
这是我的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位于“产品”应用下,因此网址名称空间为“产品:产品”
答案 2 :(得分: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)})
答案 3 :(得分: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()