提交表单时,DJANGO 中的 POST 方法返回“None”
Posted
技术标签:
【中文标题】提交表单时,DJANGO 中的 POST 方法返回“None”【英文标题】:The POST method in DJANGO returns "None" when a form is submitted 【发布时间】:2020-04-07 07:40:15 【问题描述】:我已经构建了一个小型 Web 应用程序,它将从 html 表中获取数据并将其转储到 sqlite 数据库中。当我使用 POST 方法捕获特定的单元格值时,它不会返回任何值。有人可以帮我如何从我在 table.html 下面创建的表中获取数据吗?最初我只是想打印元素“name”的值,稍后我会将它添加到 DB。我希望输出为 ["name1","name2"]
models.py
from django.db import models
class people(models.Model):
Company = models.TextField()
Contact = models.TextField()
Country = models.TextField()
def __str__(self):
return self.Contact
urls.py
from django.contrib import admin
from django.urls import path, include
from . import views
urlpatterns = [
path('', views.getvalue, name='myapp'),
]
views.py
from django.shortcuts import render
def home(request):
return render(request, 'myapp/table.html')
def getvalue(request):
if request.method == "POST":
value = request.POST.get("cellvalue")
print("The values is", value, request.method)
return render(request, 'myapp/table.html')
table.html
<html>
<head>
</head>
<body>
<form role="form" action="getvalue", method="post">% csrf_token %
<input type="submit" value="Update DB" />
<table>
<tr>
<td name='cellvalue'>name1</td>
<td name='cellvalue'>name2</td>
</tr>
</table>
</form>
</body>
</html>
【问题讨论】:
也许尝试指定表单操作? ***.com/questions/9401521/… 验证 request.method == 'POST' 也无妨 这能回答你的问题吗? django - what goes into the form action parameter when view requires a parameter? @Rekamanon: 1) 我已经指定了表单动作。 2)我已经验证了该方法是post 3)我链接并没有真正说明如何从表元素中获取价值。提前感谢您的帮助。此外,如果我从简单的输入框中查询值,则此技术有效。我只是不适用于桌子。你能检查一下并确认吗? 【参考方案1】:好吧,我不是真正的 django 人,但你确定你的模板发布了任何价值吗?
def getvalue(request):
value = request.POST.get("R1")
print("The R1 values is", value)
return render(request, 'myapp/table.html')
在第一次调用时根本不会有任何 post 变量,所以如果您想处理这个问题,最好使用 FormView。
更新一些东西(可能不是最好的方法,因为我不是 django pro)
所以我会选择提供一些开箱即用功能的 FormView。我只有一个 AuthenticationForm 的例子,但它可能会让你从这里开始
如此简单的视图可能看起来像那样
class UserLoginView(FormView):
form_class = AuthenticationForm #UserLoginForm
template_name = 'yourApp/registration/login.html'
success_url = reverse_lazy('users_list')
表单的模板可能是这样的
<!-- templates/registration/login.html -->
% load staticfiles %
<link rel="stylesheet" type="text/css" href="% static 'yourApp/css/style.css' %">
<h2>Login</h2>
<form method="post" >
% csrf_token %
form.as_p
<input type="submit"/>
</form>
所以这里的魔法是由 django 完成的,因为我们只告诉模板使用 post 发布内容,并且提供了表单魔法,因为 django 知道我们使用身份验证表单。因此,要做更多有用的事情,您可能需要阅读一些内容并相应地构建您的模板。也就是说,您需要告诉您的表单将帖子数据发送到哪里!
所以这行真的 POST 数据到你的 getvalue 方法吗???
<form role="form" action="getvalue", method="post">
如果你不知道为什么不在你的方法中做一点打印调试呢?
def getvalue(request):
print(dir(request))
if request.method == "POST":
value = request.POST.get("cellvalue")
print("The values is", value, request.method)
return render(request, 'myapp/table.html')
您现在应该在控制台中看到很多内容,并找出您真正想知道的细粒度内容。
更新您的代码
用这种形式
<form role="form" action="getvalue", method="post">% csrf_token %
<table class = "table1">
<input type="submit" value="Update DB"/>
<tr>
<td><input class = splinput type="label" name = "cellvalue" value=""/></td>
<td><input class = splinput type="label" name = "cellvalue" value=""/></td>
<td><input class = splinput type="label" name = "cellvalue" value=""/></td>
</tr>
</form>
您需要明确后端与 what.so 的关系
变成类似
<td><input class = splinput type="text" name = "give_me_some_unique_name" value="and_pass_a_value"/></td>
要了解您可能想要去这里的输入类型
https://www.w3schools.com/html/html_form_input_types.asp
仔细阅读
之后,您的视图应该得到可以处理 request.POST 对象的东西。这里你输入的名字应该是 course value 的 key 和 value。
【讨论】:
我已经稍微修改了代码,请问代码还有什么问题吗? 就像我说我对 django 做的不多,所以我不能真正调试很多,但是当我开始玩 django 时,我尝试分享我的发现。我将在我的帖子中更新我将如何处理它。请记住,我也是这里的新手【参考方案2】:我稍微修改了 HTML 文件,得到了预期的结果。看来我需要在每个“td 元素”中插入一个输入,然后查询它的值。请在下面找到代码:
<html>
<body>
<style>
.splinput
border: none;
background: transparent;
height: 100%;
width: 100%;
table
font-family: arial, sans-serif;
border-collapse: collapse;
width: 30%;
table-layout:fixed;
td, th
border: 1px solid #dddddd;
text-align: left;
padding: 0px;
height: 30
</style>
<form role="form" action="getvalue", method="post">% csrf_token %
<table class = "table1">
<input type="submit" value="Update DB"/>
<tr>
<td><input class = splinput type="text" name = "cellvalue" value=""/></td>
<td><input class = splinput type="text" name = "cellvalue" value=""/></td>
<td><input class = splinput type="text" name = "cellvalue" value=""/></td>
</tr>
</form>
</body>
</html>
【讨论】:
你想做什么?你想在输入中输入值吗?如果是这样,您需要一个texbox。如果不是,你需要让事情变得可区分。所以你命名所有输入单元格值并将值设置为一个无法区分的空字符串,并且标签不是输入类型! 我的目标很简单。我有一个表,我无法使用 POST 方法从表中检索单元格元素的值。单元格是可编辑的,我使用命令“contenteditable = true”选项使其可编辑。我的问题是当我写这样的以上是关于提交表单时,DJANGO 中的 POST 方法返回“None”的主要内容,如果未能解决你的问题,请参考以下文章
使用 formset / managment_form 变量时,提交的 Django 表单没有 POST 数据
Django在以post的方式提交表单时报错CSRF verification failed. Request aborted的解决办法