Django模型未在Admin显示,表单提交CSRF令牌及数据出现在URL栏
解决你的两个Django问题
问题1:自定义Contact模型未在Admin后台显示
这是新手入门Django时很常见的小问题——Django不会自动把你自定义的模型加入Admin后台,必须手动完成注册操作。
解决方案:
找到你定义Contact模型的app(看起来是prop)下的admin.py文件,添加以下代码:
from django.contrib import admin from .models import Contact # 导入你的Contact模型 # 注册模型到Admin站点 admin.site.register(Contact)
保存后重启Django服务器,刷新Admin后台就能看到Contact模型的管理入口了。
问题2:表单提交变为GET请求,数据暴露在URL中
从你的请求日志和代码细节来看,核心问题是表单提交路径不匹配,再加上视图逻辑的小疏漏,导致POST请求被自动转为GET。
原因分析:
- 模板里表单的
action写死为"/contact",但你的请求日志显示实际请求路径是"/prop/contact/"——说明你的URL配置里contact视图是挂载在/prop/前缀下的。当POST请求发送到不存在的/contact路径时,服务器会返回重定向响应,而浏览器会自动把POST请求转为GET,同时把表单数据拼到URL里。 - 你的视图处理完POST请求后直接用
render返回页面,没有做重定向,这不仅会导致刷新页面时重复提交表单,也会让浏览器的请求状态出现异常。
解决方案:
步骤1:用URL反向解析避免硬编码路径
先给你的contact视图设置名称,在prop/urls.py里修改:
from django.urls import path from . import views urlpatterns = [ # 其他URL配置... path('contact/', views.contact, name='contact'), # 增加name参数 ]
然后修改模板中的表单action,用Django的模板标签动态生成正确路径:
<form action="{% url 'contact' %}" method="post">
这样不管你的URL前缀怎么调整,表单都会提交到正确的地址。
步骤2:修改视图逻辑,POST后重定向
更新contact视图函数,保存数据后用redirect跳转,而不是直接渲染页面:
from django.shortcuts import render, redirect from .models import Contact def contact(request): if request.method == 'POST': name = request.POST['name'] email = request.POST['email'] phone = request.POST['phone'] desc = request.POST['desc'] contact = Contact(name=name, email=email, phone=phone, desc=desc) contact.save() # 重定向到contact页面,也可以自定义一个提交成功的页面 return redirect('contact') # GET请求时返回表单页面 return render(request, 'prop/contact.html')
这样处理后,表单提交会保持POST方式,数据不会暴露在URL里,还能避免用户刷新页面重复提交表单的问题。
内容的提问来源于stack exchange,提问作者Yash Gupta
相关产品推荐
相关产品推荐

