在URL中使用类别Slug,而不是pk

时间:2019-08-29 22:15:56

标签: python django

现在,我可以通过转到example.com/products/1来显示产品详细信息页面,但是我希望能够转到example.com/<category_slug>/<product_slug>

views.py

def product_detail(request, pk):
    product = Product.objects.get(pk=pk)
    return render(request, 'main/product_detail.html', {'product': product})

根urls.py

from main.views import product_detail

path('products/<int:pk>/', product_detail, name='product-detail'),

1 个答案:

答案 0 :(得分:1)

在您的Product模型中,您将需要以下内容:

class Product(model.Models):
    slug = models.CharField(max_length=255)
    # Other fields

然后在您看来:

from django.http import HttpResponseNotFound
def product_detail(request, slug):
    try:
        product = Product.objects.get(slug=slug)
    except Product.DoesNotExist:
        return HttpResponseNotFound()
    return render(request, 'main/product_detail.html', {'product': product})

在您的urls.py文件中:

from main.views import product_detail

path('products/<str:slug>/', product_detail, name='product_detail'),

与使用PK完全相同,只是使用字符串代替。字符串只需要存储在数据库中(从某种意义上说,它的作用类似于“主键”)。使其成为一个独特的领域可能也很有意义。注意,我将.get()方法包装在tryexcept中。这对于人们在请求中输入随机内容非常有用。

编辑:从技术上讲,您还应该将标志unique=True添加到您的子弹字段。这样可以防止.get()损坏。