Django视图中读取HTML表单name属性判断请求来源页面的方法
问题本质说明
浏览器提交表单时,不会自动将<form>标签的name属性作为请求参数发送,所以你直接从request.POST里无法获取到表单的name值,可通过以下两种方案实现来源判断需求:
方案1:添加隐藏输入字段(最稳定,推荐使用)
通过在表单中插入隐藏的输入字段,主动传递来源标识,可靠性最高。
第一步:修改HTML模板
在每个需要提交到practice视图的表单内部、原有内容的任意位置(推荐放在CSRF token行之后)添加隐藏字段:
<form name = "index" action = 'practice' method = "post"> {% csrf_token %} <!-- 新增隐藏字段,value值改为当前页面的标识 --> <input type="hidden" name="form_source" value="index"> <!-- 原有表单内容保持不变 --> <center> <table> <tr><td>Support portal username</td><td>:</td><td><input type = 'text' name = USERNAME size="50"></td></tr> <!-- 剩余表单内容省略 --> </table> </center> </form>
如果是home页面的表单,把隐藏字段的value改为home即可。
第二步:修改views.py视图代码
直接读取POST请求中的隐藏字段值做判断:
from django.http import HttpResponse def practice(request): if request.method == "POST": form_source = request.POST.get("form_source", "unknown") if form_source == "index": return HttpResponse("请求来自index页面") elif form_source == "home": return HttpResponse("请求来自home页面") else: return HttpResponse("请求来自未知页面") # 非POST请求的逻辑可自行补充 return HttpResponse("请求方法不支持")
方案2:读取HTTP_REFERER请求头(兼容性差,不推荐)
如果不想修改前端代码,可以尝试读取请求头中的来源地址,但该值可能被浏览器、代理服务禁用或篡改,可靠性低:
def practice(request): referer_url = request.META.get("HTTP_REFERER", "") if "index" in referer_url: return HttpResponse("请求来自index页面") elif "home" in referer_url: return HttpResponse("请求来自home页面") else: return HttpResponse("请求来自未知页面")
内容的提问来源于stack exchange,提问作者Harikrishna Gannu
相关产品推荐
相关产品推荐

