现在,我可以通过转到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'),
答案 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()
方法包装在try
和except
中。这对于人们在请求中输入随机内容非常有用。
编辑:从技术上讲,您还应该将标志unique=True
添加到您的子弹字段。这样可以防止.get()
损坏。