Django模型关联异常:点击图书显示全部页面而非关联页面
问题解决:仅展示选中图书关联的页面
问题根源
你的Second_page视图直接查询了所有Page对象(Page.objects.all()),没有根据传入的book_slug过滤出对应图书的页面,因此打开页面时会显示全部已创建的Page。
修复步骤
1. 优化Model字段名(可选但推荐)
将Page模型里的title_title字段名改为更直观的book,提升代码可读性:
# models.py class Page(models.Model): # 替换原title_title字段为book book = models.ForeignKey('Book', on_delete=models.PROTECT) number_page = models.CharField(max_length=500) def __str__(self): return self.number_page
2. 修改视图函数,过滤对应图书的页面
在Second_page中,先获取目标图书对象,再查询该图书关联的所有页面:
# views.py def Second_page(request, book_slug): # 获取指定slug的图书,不存在则返回404 book = get_object_or_404(Book, slug=book_slug) # 过滤出属于当前图书的页面 # 若未修改字段名,此处改为filter(title_title=book) page = Page.objects.filter(book=book) return TemplateResponse(request, "second.html", {'page': page})
3. 优化模板链接(可选)
在first.html中使用get_absolute_url生成链接,避免硬编码slug:
<!-- first.html --> {% extends 'index.html' %} {% block content %} {% for b in book %} <ul> <li><a href="{{ b.get_absolute_url }}">{{ b.title }}</a></li> </ul> {% endfor %} {% endblock %}
同时需统一get_absolute_url与urls.py的命名:
# models.py的Book类中修改get_absolute_url def get_absolute_url(self): return reverse('Second_page', kwargs={'book_slug': self.slug})
修改完成后,打开对应图书的页面时,将仅展示该图书关联的所有Page。
内容的提问来源于stack exchange,提问作者phoenixcoml
相关产品推荐
相关产品推荐

