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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:36:02