提交表单时,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”选项使其可编辑。我的问题是当我写这样的 name1 为什么我无法使用 post 获取单元格内的文本内容? 当您阅读 django 文档时,它会告诉您 POST 是一个类似 dict 的对象,据我所知,您可以在那里使用 get 方法。所以如果你做 POST.get("a_name") 它应该给你 POST 变量 a_name 的值。然后你需要确保 a_name 在你的表单中获得一个值。因此,首先尝试打印调试方法,看看您是否从 POST 对象中的输入中获取值。您可能需要考虑这里的优先级,value="" 或输入标签之间的字符串,但这也很容易找出,放入 value="foo" 并调试您的 POST 对象... 我试过这样做,但当我在 td 中没有输入时,它没有返回任何内容 再次,标签不是输入字段,只需先尝试一些简单的东西,只需一个输入文本的表单,然后提交它。也许尝试将操作定义到您的 html 页面而不是视图,然后查看最终结果并从那里获取。我不能真正为你调试,也不能教你 html 那是你必须做的任务。我指出了您需要检查的内容,而要做的部分是在您的网站上。

以上是关于提交表单时,DJANGO 中的 POST 方法返回“None”的主要内容,如果未能解决你的问题,请参考以下文章

django1.11如何用post方法提交表单

使用 formset / managment_form 变量时,提交的 Django 表单没有 POST 数据

表单提交后 POST 方法返回 404 - Laravel

Django在以post的方式提交表单时报错CSRF verification failed. Request aborted的解决办法

刷新时重新提交的django表单

django框架学习:二十四.django表单post登录案例