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

Django表单提交后跳转至带PK的动态URL实现问题求助

Django表单提交后跳转带pk的动态URL失败问题

问题背景

实现Django表单提交后跳转至带主键(pk)的动态URL页面展示选项汇总功能时遇到障碍,此前在新项目中成功实现过相同逻辑,但当前项目始终无法正常运行。

当前相关配置

1. Model配置

models.py中自定义主键:

task_id = models.AutoField(primary_key=True)

2. 表单页面访问

导航栏链接指向表单页面hunting.html:

<a class="nav-link {% if 'hunting' in segment %} active {% endif %}"  href="/hunting.html">

3. 表单处理视图(app/views.py)

使用基于类的视图Hunting处理表单提交:

class Hunting(LoginRequiredMixin, View):
    def get(self, request):
        form = HuntForm()
        print('Access Hunting')
        return render(request, 'home/hunting.html', {'form': form})

    def post(self, request):
        form = HuntForm(request.POST, request.FILES)

        name = request.POST['name']
        limit = request.POST['limit']
        os = request.POST.getlist('os')
        mal = request.POST.getlist('mal')
        my_type = request.POST.getlist('my_type')
        if form.is_valid():
            form.save()
            print('Hunt information is saved')
            return redirect('home/index.html')
        return redirect('home/index.html')

4. URL配置(app/urls.py)

path('', views.index, name='home'),
path('hunting.html', views.Hunting.as_view(), name='hunting'),
# 匹配任意html文件
re_path(r'^.*\.*', views.pages, name='pages'),

已尝试的方案及问题

  1. 创建URL路径path('hunting/<int:pk>', views.Hunting.as_view(), name='hunting-task')并尝试跳转,失败。
  2. 新建独立视图和HTML页面,因逻辑混乱回滚。
  3. 改用类视图仍无法实现目标。
  4. 更新方案:
    • 新增URL路径:path('hunting/<int:pk>/', views.HuntTaskView.as_view(), name='hunt-task')
    • 新增DetailView类:
      class HuntTaskView(DetailView):
          form = HuntForm
          template_name = 'task-view.html'
      
    • 提交表单时触发错误:

      django.urls.exceptions.NoReverseMatch: Reverse for 'hunt-task' with arguments '(,)' not found. 1 pattern(s) tried: ['hunting/(?P[0-9]+)/$']

期望实现流程

用户访问hunting.html→填写表单→提交后跳转至类似localhost:80/hunting/1的动态URL页面,展示提交的选项汇总。


解决步骤

1. 修正DetailView配置

DetailView必须指定对应Model,同时显式配置自定义主键相关参数:

class HuntTaskView(DetailView):
    model = HuntModel  # 替换为你实际的Model类名
    pk_url_kwarg = 'pk'
    context_object_name = 'task'  # 模板中用于获取对象的变量名
    template_name = 'task-view.html'
    pk_field = 'task_id'  # 匹配你自定义的主键字段

2. 修正表单提交后的跳转逻辑

form.save()会返回保存后的对象实例,用该实例的主键生成跳转URL:

def post(self, request):
    form = HuntForm(request.POST, request.FILES)
    if form.is_valid():
        # 保存并获取实例
        task_instance = form.save()
        print('Hunt information is saved')
        # 传入主键参数跳转到详情页
        return redirect('hunt-task', pk=task_instance.task_id)
    # 验证失败返回原页面,保留表单错误信息
    return render(request, 'home/hunting.html', {'form': form})

注:手动获取POST参数的代码可删除,form.save()会自动处理字段存储,除非你有额外业务逻辑需要单独处理。

3. 调整URL匹配顺序

Django按从上到下顺序匹配URL,需将动态URL放在通用匹配规则之前,避免被拦截:

path('', views.index, name='home'),
path('hunting.html', views.Hunting.as_view(), name='hunting'),
# 动态URL置于通用匹配前
path('hunting/<int:pk>/', views.HuntTaskView.as_view(), name='hunt-task'),
# 匹配任意html文件
re_path(r'^.*\.*', views.pages, name='pages'),

4. 模板展示提交数据

在task-view.html中通过{{ task }}(对应context_object_name)访问提交内容:

<h1>任务详情:{{ task.name }}</h1>
<p>限制值:{{ task.limit }}</p>
<p>操作系统:{{ task.os|join:", " }}</p>
<p>恶意类型:{{ task.mal|join:", " }}</p>
<p>任务类型:{{ task.my_type|join:", " }}</p>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:40:41