Django中的get_absolute_url id和slug

Posted

技术标签:

【中文标题】Django中的get_absolute_url id和slug【英文标题】:get_absolute_url id and slug in Django 【发布时间】:2020-11-26 13:59:51 【问题描述】:

你好,我希望我的网址是这样的:

site.com/blog/books/details/[id]/[slug]

例如:site.com/blog/books/details/3/blind_owl

当我点击书名时,什么都不加载。甚至不显示错误。我想给我看说明

提前谢谢你

型号:

class Book(TimeStampMixin):
    id = models.AutoField(primary_key=True)
    author = models.ForeignKey(to=Author, on_delete=models.PROTECT)
    book_name = models.TextField()

    def __str__(self):
        return ''.format(self.book_name)

class Details(TimeStampMixin):
    book = models.ForeignKey(to=Book, on_delete=models.PROTECT)
    description = models.TextField()
    slug = models.SlugField(max_length=100, null=True, blank=True)

    def get_absolute_url(self):
        return reverse('blog:book_details', args=[self.pk, self.slug])

    def __str__(self):
        return ''.format(self.book)

主网址:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.home, name='home'),
    path('blog/', include('blog.urls')),
]

网址:

urlpatterns = [
    path('authors/', views.authors, name='authors'),
    path('books/', views.books, name='books'),
    path('books/details/<int:pk>/<slug:slug>/', views.book_details, name='book_details')

查看:

def books(request):
    book = Book.objects.all()
    context = 'books': book
    return render(request, 'Blog/books.html', context=context)

def book_details(request, pk, slug):
    details = Details.objects.filter(pk=pk, slug=slug)
    context = 'details': details
    return render(request, 'Blog/book_details.html', context=context)

书籍模板:

% for each in books %
<a href=" each.get_absolute_url ">
    Book's Name:  each.book_name 
</a>
% endfor %

图书详情模板:

% for each in details %
Description:  each.description 
% endfor %

【问题讨论】:

【参考方案1】:

我认为在 Book 模板中,您应该将书名放在 &lt;a&gt; 标记内。 所以

% for each in books %
<a href=" each.get_absolute_url ">
    Book's Name:  each.book_name 
</a> <!-- ended tag here -->
% endfor %

【讨论】:

【参考方案2】:

试试这个

class Details(TimeStampMixin):
...
  def get_absolute_url(self):
          return reverse('blog:book_details', kwargs='id': self.id)
...

和模板

% block content %
    % for obj in object_list %
        <li> forloop.counter  - <a href=" obj.get_absolute_url "> obj.title </a></li>
        <br>
    % endfor %
% endblock %

【讨论】:

以上是关于Django中的get_absolute_url id和slug的主要内容,如果未能解决你的问题,请参考以下文章

为啥 django page cms get_absolute_url 返回一个空字符串?

在 Django auth 中设置 `get_absolute_url`

如何在 Django 模板中使用带有外键对象的 get_absolute_url()

Django get_absolute_url 调用与当前页面相同的 URL

get_absolute_url无效

Django:删除管理员用户更改表单中的“现场查看”按钮