Django聊天机器人开发中无法获取用户输入的问题求助
问题解决:无法获取Django表单中的用户输入
核心问题分析
你遇到的{'rawText': None}问题,根源有三个:
- 请求方式不匹配:表单用
method="POST"提交,但你用request.GET.get()获取参数——GET是从URL提取参数,POST请求的参数存在request.POST对象中。 - 字段名错误:你的表单字段定义是
message(在messageForm类中),但你尝试获取textInput,和实际表单字段名不符。 - 变量未初始化:只有POST请求时才定义
context,GET请求时print(context)会抛出未定义错误,同时模板也无法拿到该变量。
修改后的代码实现
views.py
from django.shortcuts import render from .forms import messageForm from .main import get_weather, take_user_input def home(request): # 初始化聊天记录,默认包含机器人初始消息 chat_history = [{"sender": "bot", "text": "Hi! Let's get to chatting."}] if request.method == "POST": # 绑定POST数据到表单,完成验证 form = messageForm(request.POST) if form.is_valid(): # 从表单清洗后的数据中获取用户输入 user_input = form.cleaned_data['message'] chat_history.append({"sender": "user", "text": user_input}) # 调用自定义模块处理输入,生成机器人回复 bot_response = take_user_input(user_input) chat_history.append({"sender": "bot", "text": bot_response}) else: # GET请求时初始化空表单 form = messageForm() # 将聊天记录和表单传入模板 return render(request, 'home.html', {'form': form, 'chat_history': chat_history})
home.html
修改模板,循环渲染聊天记录,同时保留原有表单结构:
{% extends 'base.html'%} {% load static %} {% block content %} <h2>Blue's Chatbot</h2> <div id="chatbox"> {% for message in chat_history %} {% if message.sender == 'bot' %} <p class="botText"><span>{{ message.text }}</span></p> {% else %} <p class="userText"><span>{{ message.text }}</span></p> {% endif %} {% endfor %} </div> <div id="userInput"> <form method="POST" novalidate> {% csrf_token %} {{ form }} <input id="buttonInput" type="submit" value="Send"> </form> </div> {% endblock %}
后续优化建议(实现无刷新即时通讯)
当前代码提交表单会刷新页面,要实现类似即时通讯的流畅体验,需要用AJAX提交请求:
- 给表单添加ID,编写JavaScript监听表单提交事件,阻止默认页面刷新行为。
- 用
fetch或原生XMLHttpRequest发送POST请求,携带CSRF令牌和用户输入内容。 - 后端新增一个API视图专门处理AJAX请求,返回JSON格式的机器人回复。
- 前端收到回复后,动态将用户输入和机器人回复追加到
chatbox中。
内容的提问来源于stack exchange,提问作者Blue
相关产品推荐
相关产品推荐

