将我的网址从id更改为title |詹戈

时间:2019-03-01 20:18:17

标签: django

我有一个网址,用于按其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)

但是我的客户要求我改为更改标题,但我尝试了一下,但似乎没有用,文档中也没有示例。

2 个答案:

答案 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看起来“不好”,使用主键也是正确的方法。