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'),
已尝试的方案及问题
- 创建URL路径
path('hunting/<int:pk>', views.Hunting.as_view(), name='hunting-task')并尝试跳转,失败。 - 新建独立视图和HTML页面,因逻辑混乱回滚。
- 改用类视图仍无法实现目标。
- 更新方案:
- 新增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]+)/$']
- 新增URL路径:
期望实现流程
用户访问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
相关产品推荐
相关产品推荐

