You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django两类模型文章标题跳转报错问题排查求助

问题分析与解决方法

错误原因

  1. blogid() got an unexpected keyword argument 'id' 错误
    你的blogid视图函数未定义接收id参数,但URL配置里的<int:id>会将id作为参数传递给视图,导致参数不匹配。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 14:07:24