Django中/articles/1/正常加载,/articles/2/报404错误求助
问题排查与解决方法
1. 检查视图查询逻辑与URL参数的匹配
如果你的DetailView绑定的是ArticleContent模型,但URL传递的是文章的article_id而非ArticleContent自身的主键(pk),就会触发404。默认情况下DetailView会用URL里的pk参数匹配模型的主键字段(通常是id),而非外键article_id。
修复方案:修改视图逻辑,指定按article_id查询,同时调整URL参数名:
from django.views.generic.detail import DetailView from .models import ArticleContent class ArticleDetailView(DetailView): model = ArticleContent template_name = 'article_detail.html' pk_url_kwarg = 'article_id' # 指定URL参数对应字段 def get_object(self, queryset=None): # 明确通过article_id获取对应内容 return ArticleContent.objects.get(article_id=self.kwargs['article_id'])
同时更新URL配置:
path('articles/<int:article_id>/', ArticleDetailView.as_view(), name='article-detail')
2. 确认Article模型存在对应ID的记录
如果视图关联的是Article模型,但Article表中没有id=2的记录,即使ArticleContent有article_id=2,也会因外键关联对象不存在导致查询失败(除非外键设置了null=True)。
修复方案:检查Article数据表,确保存在id=2的记录。如果Article与ArticleContent是一对一绑定,建议将外键改为OneToOneField,保证数据一致性。
3. 排查视图的QuerySet过滤条件
若视图设置了过滤规则(比如仅显示已发布文章),可能id=2的文章被过滤排除了。例如:
class ArticleDetailView(DetailView): model = Article queryset = Article.objects.filter(is_published=True) # 若id=2的文章未发布,会触发404
修复方案:移除不必要的过滤条件,或修改对应文章的状态以符合过滤规则。
4. 验证模板数据引用是否正确
如果视图能正常获取数据,但模板中错误引用了其他文章的内容,也可能造成“数据不存在”的错觉。比如模板中固定调用了{{ article.content_set.first }},但id=2的文章有多条ArticleContent记录。
验证方法:在视图中添加调试代码,确认获取的对象是否正确:
def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) print(context['object']) # 控制台查看获取的对象信息 return context
内容的提问来源于stack exchange,提问作者cantrip
相关产品推荐
相关产品推荐

