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

Django页面关联异常:订单查询跳转功能失效求助

问题排查与修复方案

你的代码存在几个关键问题,导致输入订单号后无预期反应,以下是逐个修复方案:


1. HTML表单缺少核心输入元素与提交配置

你的index.html表单没有订单号输入框,也未指定表单的method和action,导致提交时无法传递order_number参数,页面自然只会刷新。

修正后的index.html表单代码:

{% block content %}
<form method="POST" action="{% url 'shipment' %}">
    {% csrf_token %}
    <!-- 添加订单号输入框,name属性必须为order_number,和视图中取值对应 -->
    <input type="text" name="order_number" placeholder="请输入订单号" required>
    <button type="submit">Track</button>
</form>
{% endblock %}
{% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li {% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
    {% endfor %}
</ul>
{% endif %}

2. 视图逻辑存在两处错误

  • 找到订单后重定向到shipment视图,但该视图在GET请求时返回index.html,无法展示订单详情;且未传递订单数据到详情页
  • 错误提示使用普通变量message,但模板依赖Django的messages框架渲染,导致提示无法显示

修正后的views.py代码:

from django.contrib import messages
from django.shortcuts import render, get_object_or_404, redirect

def shipment(request):
    if request.method == 'POST':
        # 用get方法避免未输入时抛出KeyError
        order_number = request.POST.get('order_number')
        if not order_number:
            messages.error(request, "请输入订单号")
            return redirect('index')
        
        try:
            shipment = Shipment.objects.get(order_number=order_number)
            # 直接渲染shipment.html并传递订单数据,无需重定向
            return render(request, 'shipment.html', {'shipment': shipment})
        except Shipment.DoesNotExist:
            messages.error(request, f"订单ID {order_number} 不存在于数据库中")
            return redirect('index')
    # GET请求默认返回首页
    return render(request, 'index.html')

3. URL配置存在冲突

你的urls.py中多个路径使用空字符串,导致只有第一个匹配的视图生效;重复的name也会引发路由解析混乱。

修正后的urls.py代码:

from django.urls import path
from . import views

urlpatterns = [
    path("", views.index, name="index"),
    path("login/", views.login, name="login"),  # 给登录路径添加前缀,避免冲突
    path("track/", views.shipment, name="shipment"),  # 修改订单查询路径
]

4. Model字段缺少必要参数

current_location字段是CharField但未指定max_length,这会导致Django迁移报错,需要补充:

修正后的models.py代码:

class Shipment(models.Model):
    member_id = models.CharField(max_length=100)
    order_number = models.CharField(max_length=100)
    tracking_id = models.CharField(max_length=10)
    priority = models.IntegerField()
    current_location = models.CharField(max_length=200)  # 补充max_length参数
    destination = models.CharField(max_length=100)
    # 建议将delivery_date改为DateField,更符合日期存储逻辑:
    # delivery_date = models.DateField()
    delivery_date = models.IntegerField()

5. 补充订单详情页(shipment.html)示例

需要创建shipment.html来展示查询到的订单信息:

{% block content %}
<h1>订单详情</h1>
<div class="shipment-info">
    <p><strong>订单号:</strong>{{ shipment.order_number }}</p>
    <p><strong>会员ID:</strong>{{ shipment.member_id }}</p>
    <p><strong>追踪ID:</strong>{{ shipment.tracking_id }}</p>
    <p><strong>优先级:</strong>{{ shipment.priority }}</p>
    <p><strong>当前位置:</strong>{{ shipment.current_location }}</p>
    <p><strong>目的地:</strong>{{ shipment.destination }}</p>
    <p><strong>预计送达日期:</strong>{{ shipment.delivery_date }}</p>
</div>
{% endblock %}

内容的提问来源于stack exchange,提问作者Anurag Mishra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 13:51:05