Django:单表单适配多页面,编辑后返回原页面问题
解决同一编辑表单重定向回原DataTables页面的最佳实践
核心方案:正确传递并处理next参数
1. 在编辑按钮链接中携带next参数
在两个DataTables页面的编辑按钮生成时,把当前页面的URL作为next参数拼到编辑链接里。模板中示例代码:
<!-- 假设编辑视图的URL名称是 'object_edit' --> <a href="{% url 'object_edit' object.id %}?next={{ request.path|urlencode }}">编辑</a>
用request.path获取当前页面路径,urlencode处理特殊字符,确保参数传递合法。
2. 在编辑视图中接收并验证next参数
在处理编辑的视图函数里,先从GET参数中取出next值,验证该URL属于安全域名(防止钓鱼跳转),完成编辑后重定向到目标页面:
from django.http import HttpResponseRedirect from django.utils.http import is_safe_url from django.shortcuts import get_object_or_404, render def object_edit(request, object_id): obj = get_object_or_404(YourModel, id=object_id) form = YourEditForm(request.POST or None, instance=obj) if request.method == 'POST' and form.is_valid(): form.save() # 获取next参数,默认跳转到首页 next_url = request.GET.get('next', '/') # 验证URL安全性 if is_safe_url(next_url, allowed_hosts=request.get_host()): return HttpResponseRedirect(next_url) else: return HttpResponseRedirect('/') return render(request, 'edit_form.html', {'form': form, 'object': obj})
3. 处理DataTables异步加载的特殊情况
如果表格是通过Ajax异步渲染数据,需要在后端接口生成编辑链接时带上next参数:
from django.http import JsonResponse from django.urls import reverse def datatable_data(request): queryset = YourModel.objects.filter(...) data = [] for obj in queryset: # 获取当前页面完整URL作为next参数 next_url = request.build_absolute_uri() edit_url = reverse('object_edit', args=[obj.id]) + f'?next={next_url}' data.append({ 'id': obj.id, 'name': obj.name, 'edit_link': edit_url }) return JsonResponse({'data': data})
为什么HTTP_REFERER会失效?
DataTables的Ajax请求通常会覆盖Referer头,部分浏览器在跨协议、跨域场景下也不会发送Referer,依赖HTTP_REFERER稳定性差,next参数是更可靠的方案。
内容的提问来源于stack exchange,提问作者Chris Macaluso
相关产品推荐
相关产品推荐

