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

如何在Django中接收表单数据并传递给JavaScript?

解决Django表单数据处理后传递给JavaScript的问题

方案一:AJAX异步提交(无页面跳转)

通过前端JS拦截表单默认提交行为,发送异步请求,后端处理后返回JSON数据给JS,全程不刷新页面。

1. 前端HTML修改

添加CSRF令牌(Django强制要求)和AJAX提交逻辑:

<form id="name-form" action="/your-name/" method="post">
  {% csrf_token %}
  <label for="your_name">Your name: </label>
  <input id="your_name" type="text" name="your_name" value="{{ current_name }}">
  <input type="submit" value="OK">
</form>

<script>
document.getElementById('name-form').addEventListener('submit', function(e) {
  e.preventDefault(); // 阻止默认页面跳转

  const formData = new FormData(this);
  fetch(this.action, {
    method: 'POST',
    body: formData,
    headers: {
      'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value
    }
  })
  .then(response => response.json())
  .then(data => {
    // 此处处理后端返回的数据,示例:打印并弹窗展示
    console.log('处理后的数据:', data);
    alert(`处理结果:${data.processed_name}`);
  })
  .catch(error => console.error('请求失败:', error));
});
</script>

2. 后端views.py修改

替换跳转逻辑为返回JSON响应:

from django.shortcuts import render
from django.http import JsonResponse
from .forms import NameForm


def home(request):
    return render(request, 'index.html')


def get_name(request):
    if request.method == "POST":
        form = NameForm(request.POST)
        if form.is_valid():
            # 自定义数据处理逻辑,示例:为名字添加前缀
            processed_name = f"Hello, {form.cleaned_data['your_name']}!"
            return JsonResponse({'processed_name': processed_name})
        # 表单验证失败时返回错误信息
        return JsonResponse({'error': '名字长度不能超过100字符'}, status=400)
    # GET请求返回空表单
    form = NameForm()
    return render(request, "index.html", {"form": form})

方案二:页面刷新后传递数据

保留表单跳转逻辑,处理后将数据传递给模板,再由JS读取模板变量。

1. 后端views.py修改

处理数据后直接渲染页面并传递结果:

from django.shortcuts import render
from .forms import NameForm


def home(request):
    return render(request, 'index.html')


def get_name(request):
    processed_name = None
    if request.method == "POST":
        form = NameForm(request.POST)
        if form.is_valid():
            processed_name = f"Hello, {form.cleaned_data['your_name']}!"
    else:
        form = NameForm()
    
    return render(request, "index.html", {
        "form": form,
        "processed_name": processed_name
    })

2. 前端HTML修改

添加JS代码读取Django传递的模板变量:

<form action="/your-name/" method="post">
  {% csrf_token %}
  <label for="your_name">Your name: </label>
  <input id="your_name" type="text" name="your_name" value="{{ current_name }}">
  <input type="submit" value="OK">
</form>

{% if processed_name %}
<script>
// 读取Django传递的处理结果
const result = "{{ processed_name }}";
console.log('处理后的数据:', result);
alert(result);
</script>
{% endif %}

核心注意事项

  • 所有POST请求必须携带{% csrf_token %},否则Django会拦截请求。
  • 方案一适合无刷新交互场景,方案二适合简单的页面刷新展示需求。
  • 务必保留表单验证逻辑,确保数据合法后再处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 10:13:33