Django两类模型文章标题跳转报错问题排查求助
问题分析与解决方法
错误原因
blogid() got an unexpected keyword argument 'id'错误
你的blogid视图函数未定义接收id参数,但URL配置里的<int:id>会将id作为参数传递给视图,导致参数不匹配。Finnews文章点击后404错误
视图中用同一个id同时查询Fingram和Finnews模型,当点击Finnews文章时,该id仅存在于Finnews数据表,不存在于Fingram数据表,get_object_or_404(Fingram, pk=id)会触发404错误。
修复步骤
步骤1:修正视图函数参数与逻辑
修改blog/views.py,给两个模型分别创建独立的详情视图,避免交叉查询:
def blogmain(request): all_fingrams = Fingram.objects.order_by('-id') all_finnewss = Finnews.objects.order_by('-id') data = { 'all_fingrams': all_fingrams, 'all_finnewss': all_finnewss, } return render(request,'blog/financial-news.html', data) # Fingram详情视图 def fingram_detail(request, id): single_fingram = get_object_or_404(Fingram, pk=id) return render(request,'blog/financialarticle.html', {'single_fingram': single_fingram}) # Finnews详情视图 def finnews_detail(request, id): single_finnews = get_object_or_404(Finnews, pk=id) return render(request,'blog/financialarticle.html', {'single_finnews': single_finnews})
步骤2:更新URL配置
修改blog/urls.py,为两个详情视图分别配置独立URL:
urlpatterns = [ path('', views.blogmain, name='blogmain'), path('fingram/<int:id>/', views.fingram_detail, name='fingram_detail'), path('finnews/<int:id>/', views.finnews_detail, name='finnews_detail'), ]
步骤3:修正模板跳转链接
修改模板中的跳转URL,对应各自的详情视图:
{% for finnews in all_finnewss %} <div class="col"> <div class="card border-light mb-3"> <img src="{{ finnews.finnewsarcticle_smallimg.url }}" class="card-img-top rounded-bottom-1" alt="..."> <div class="card-body"> <a class="card-title" href="{% url 'finnews_detail' finnews.id %}">{{finnews.finnewsarcticle_shortname}}</a> <p class="card-text">{{finnews.finnewsarcticle_shortdesc}}</p> </div> </div> </div> {% endfor %} <!-- Fingram列表部分 --> {% for fingram in all_fingrams %} <div class="col"> <div class="card border-light mb-3"> <img src="{{ fingram.fingramarcticle_smallimg.url }}" class="card-img-top rounded-bottom-1" alt="..."> <div class="card-body"> <a class="card-title" href="{% url 'fingram_detail' fingram.id %}">{{fingram.fingramarcticle_shortname}}</a> <p class="card-text">{{fingram.fingramarcticle_shortdesc}}</p> </div> </div> </div> {% endfor %}
步骤4:调整详情模板渲染逻辑
在financialarticle.html中根据传入的变量判断渲染对应文章内容:
{% if single_fingram %} <h1>{{ single_fingram.fingramarcticle_shortname }}</h1> <p>{{ single_fingram.fingramarcticle_fulltext }}</p> <!-- 其他Fingram字段渲染 --> {% elif single_finnews %} <h1>{{ single_finnews.finnewsarcticle_shortname }}</h1> <p>{{ single_finnews.finnewsarcticle_fulltext }}</p> <!-- 其他Finnews字段渲染 --> {% endif %}
额外提示
- 模型中所有
CharField必须指定max_length参数,比如models.CharField(max_length=255),否则会触发数据库迁移错误。 Finnews模型的finnewsarcticle_createddate字段设置为auto_now=False, auto_now_add=False,需要手动传入日期值;若需自动记录创建时间,可改为auto_now_add=True。
内容的提问来源于stack exchange,提问作者user27669138
相关产品推荐
相关产品推荐

