Django更新模型时Model Form数据不显示的技术问题
Django模型更新表单问题解决
问题根源
当前视图代码在GET请求时,错误地将response.POST or None传入表单,导致表单进入绑定状态但无有效数据,因此无法显示ticket的原有内容;移除response.POST后,表单处于未绑定状态能显示数据,但POST请求时无法绑定提交的数据,导致无法完成更新。另外HTML表单标签存在闭合错误,可能影响提交逻辑。
修正后的视图代码
def update_ticket(response, ticket_title): ticket = get_object_or_404(TicketsModel, title=ticket_title) if response.method == 'POST': ticket_form = AddTicketsForm(response.POST, instance=ticket, assigned_by=response.user) if 'return' in response.POST: return redirect('home', type_user=response.session.get('type_user')) if ticket_form.is_valid(): # 若无需修改创建时间,删除下面这行(建议保留原创建时间,新增更新时间字段) # ticket.ticket_creation_date = datetime.now() ticket_form.save() return redirect('home', type_user=response.session.get('type_user')) else: ticket_form = AddTicketsForm(instance=ticket, assigned_by=response.user) return render(response, "template/testapp/update_ticket.html", {'ticket_title': ticket.title, 'ticket_form': ticket_form})
关键修改说明
- 拆分GET/POST请求处理:
- GET请求时,仅传入
instance和assigned_by,表单处于未绑定状态,自动加载ticket的现有数据填充输入框。 - POST请求时,绑定
response.POST数据与instance,验证通过后保存更新。
- GET请求时,仅传入
- 注意:手动修改
ticket_creation_date会覆盖原始创建时间,若需记录更新动作,建议在TicketsModel中新增last_updated字段并设置auto_now=True,而非修改创建时间。
修正后的HTML代码
<h2>Update Ticket</h2> <form action="{% url 'update_ticket' ticket_title=ticket_title %}" method="post"> {% csrf_token %} {{ ticket_form.as_p }} <button type="submit" name="save" id="regDirect">Save</button> <button type="submit" name="return">Return</button> </form>
HTML修正点
将错误的自闭合标签<form/>改为正确的闭合标签</form>,避免表单提交逻辑异常。
内容的提问来源于stack exchange,提问作者Acno_Sama
相关产品推荐
相关产品推荐

