我有一个网址,用于按其ID检查图书:
path('book/<int:book_id>', views.book, name='book'),
视图:
def book(request, book_id):
book = get_object_or_404(Book, pk=book_id)
context = {
'book': book
}
return render(request, 'media/book.html', context)
但是我的客户要求我改为更改标题,但我尝试了一下,但似乎没有用,文档中也没有示例。
答案 0 :(得分:1)
上面答案中的NOTE不考虑SEO。出于SEO的目的,最好有一个包含书名而不是ID的URL。如果您已经投入生产,请记住在视图中执行永久重定向,将所有基于ID的URL重定向到基于Slug的URL。您的Book模型定义(或“产品”或您所称的名称)应包含一个细分字段:
class Book(models.Model):
name = models.CharField(...)
slug = models.CharField(max_length=255, default='', unique=True, blank=True)
other_fields...
def save(self, *args, **kwargs):
# Create slug for SEO
#Don't ever change once established since is part of the URI
if self.slug is None or self.slug == '':
self.slug = slugify(self.name)
super(Book, self).save(*args, **kwargs)
答案 1 :(得分:0)
您需要将网址更改为'book/<str:book_title>'
,并相应地调整功能:
def book(request, book_title):
book = get_object_or_404(Book, yourfieldfortitle=book_title)
...
尝试使用您知道必须起作用的模式首先访问url可能会有所帮助。注意:这是一个很强的假设,即一本书是按书名来标识的,否则,即使主键的URL看起来“不好”,使用主键也是正确的方法。