Django Formset提交重定向带PK失败:PK返回None求助
解决Formset创建后跳转详情页时PK为None的问题
看起来你遇到的Reverse for 'company-detail' with keyword arguments '{"pk": None}'错误,我帮你梳理下问题根源和解决办法:
问题分析
这个报错大概率来自两个核心问题:
- 模板中的无效URL反向解析:你的模板里有个多余的
</a>标签,说明之前可能存在指向company-detail的链接,而这个链接错误地使用了表单对象company的pk——注意此时company是未保存的表单实例,它的pk自然是None,导致渲染模板时就触发了反向解析失败。 - 表单集中外键字段的冗余渲染:你手动添加了
{{ child_form.company.as_hidden }},但inlineformset会自动处理父模型与子模型的外键关联,这个手动添加的隐藏字段不仅多余,甚至可能在提交时干扰表单集的关联逻辑。
另外,也要确认下CompanyModel的主键字段是否配置了自动生成(比如UUID字段需要设置默认值),避免保存后仍无有效pk。
解决方案
1. 清理模板中的无效代码
- 首先移除模板中多余的
</a>标签,新建页面里根本不需要指向详情页的链接(毕竟公司还没创建出来)。 - 删除子表单循环里的
{{ child_form.company.as_hidden }},修改后的循环代码如下:
{% for child_form in sites %} {{ child_form.sites_id.as_hidden }} <div class="form-row"> <div class="form-group col-md-12 form-col-md"> <label for="{{ child_form.id_for_label }}"><Strong>{{ child_form.label }}</Strong></label> {{ child_form }} {% if child_form.errors %} {% for error in child_form.errors %} {{ error|escape }} {% endfor %} {% endif %} </div> </div> {% endfor %}
2. 验证父模型主键配置
检查CompanyModel的主键定义:
- 如果是默认自增主键,无需额外操作;
- 如果用UUID做主键,确保模型里配置了自动生成:
import uuid from django.db import models class CompanyModel(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) # 其他字段...
3. 优化视图的表单处理(可选调试)
可以在视图里添加调试打印,确认保存后的pk是否有效,同时完善错误反馈:
def companycreateview(request): if request.method == 'POST': companyform = CompanyCreateForm(request.POST) if companyform.is_valid(): company = companyform.save(commit=False) sitesform = SitesFormSet(request.POST, request.FILES, instance=company) if sitesform.is_valid(): company.save() # 调试用:确认pk是否生成 print(f"已创建公司,PK: {company.pk}") sitesform.save() return redirect('customers:company-detail', pk=company.pk) else: print("站点表单集错误:", sitesform.errors) else: print("公司表单错误:", companyform.errors) else: companyform = CompanyCreateForm() # GET请求时绑定空实例,确保表单集初始化正确 sitesform = SitesFormSet(instance=CompanyModel()) context = { 'company': companyform, 'sites': sitesform, } return render(request, 'customers/new-company.html', context)
按照上面的步骤修改后,应该就能解决pk=None的反向解析错误,同时保证表单集的关联逻辑正常工作。
内容的提问来源于stack exchange,提问作者addohm
相关产品推荐
相关产品推荐

