如何在Django模板标签中访问主键实现数据更新?
解决Django更新视图中模板调用主键的问题
问题根源
你当前模板里用{{request.detail.id}}无法获取主键,因为request对象本身没有detail属性,且成功页视图未将对应的Detail实例传递给模板。另外还有几处细节需要调整,确保整个更新流程通顺。
具体修复步骤
1. 修改success视图,传递Detail实例到模板
用户提交表单后,需要把刚创建的Detail对象传递给success页面,模板才能拿到它的主键。修改views.py里的success视图和details视图的跳转逻辑:
from django.shortcuts import get_object_or_404 def success(request, pk): # 获取对应的Detail实例 detail = get_object_or_404(Detail, pk=pk) return render(request, "success.html", {"detail": detail}) @login_required(login_url="signin") def details(request): form = Details() if request.method == "POST": form = Details(request.POST) if form.is_valid(): detail = form.save(commit=False) detail.username = request.user detail.save() # 跳转时带上刚创建的detail的主键 return redirect('success', pk=detail.id) else: form = Details(initial={"matricno":request.user.username}) return render(request, "details.html", {"form":form})
2. 修正urls.py中的路径参数类型
Django模型默认主键是整数类型,将edit路径里的<str:pk>改成<int:pk>,同时为success路径添加pk参数:
from django.urls import path from . import views urlpatterns = [ path("details/", views.details, name="details"), path("success/<int:pk>/", views.success, name="success"), path("edit/<int:pk>/", views.updatedetails, name="updatedetails"), ]
3. 模板中正确调用主键并使用反向解析
在success.html中,不要硬写URL路径,用Django的url标签反向解析,通过传递过来的detail对象获取主键:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Success</title> </head> <body> <h1>Thank You for Filling Out the Form</h1> <!-- 使用url标签反向解析,避免硬编码路径 --> <p><a href="{% url 'updatedetails' pk=detail.id %}">Click Here To Edit</a></p> </body> </html>
4. 增强updatedetails视图的安全性(可选)
确保用户只能编辑自己的Detail实例,避免越权访问:
@login_required(login_url="signin") def updatedetails(request, pk): # 限制仅当前用户可访问自己的Detail数据 detail = get_object_or_404(Detail, pk=pk, username=request.user) form = Details(instance=detail) if request.method == "POST": form = Details(request.POST, instance=detail) if form.is_valid(): form.save() return redirect('success', pk=detail.id) return render(request, "details.html", {"form":form})
内容的提问来源于stack exchange,提问作者Olasubomi
相关产品推荐
相关产品推荐

