【问题标题】:django: get HTML form value in view.py failed with empty <QueryDict: {}> and None valuedjango:在 view.py 中获取 HTML 表单值失败,<QueryDict: {}> 为空且无值
【发布时间】:2023-03-18 09:54:01
【问题描述】:

我是 django 新手,请按照 djangogirls 教程进行操作。通过一些修改,我试图从表单文本字段中获取值并将其打印在 view.py 中,然后在 html 页面的另一个“结果”字段中再次显示该值。

html:

<!DOCTYPE html>
<html>
  <body>
    <form>
        <div>
            <label>num_1:</label>
            <input type = "text" name="num_1" value = "1" placeholder="Enter value">
        </div>
        <div>
           <label>num_2:</label>
            <input type = "text" name="num_2" value = "2" placeholder="Enter value">
        </div>
    </form>

        <div>
            <label>result:</label>
            {{ result }}
        </div>
    <br>
    </body>
</html>

view.py:

def post_list(request):
    # posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
    num1 = request.POST.get('num_1')
    num2 = request.POST.get('num_2')
    result = int(num1)+int(num2)
    print(request.POST)
    print("num1 ", num1)
    # return render(request, 'blog/post_list.html', {'posts': posts})
    return render(request, 'blog/post_list.html', {'result': result})

当我激活本地服务器时,我得到了:

Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
<QueryDict: {}>
num1  None

【问题讨论】:

  • 你如何进入post_list 我没有看到任何电话。你能添加代码吗
  • 这看起来像是你在启动 runserver 时调用 post_list(...) 的代码中的某处。这意味着它不是由 POST 请求调用,而是在内部调用,因此请求不包含 POST 数据。你设置了一个urlpatten吗?另一个提示:你的 html 表单没有提交按钮。

标签: django django-views django-forms


【解决方案1】:

您需要为您的表单添加method="post"{% csrf_token %}。例如:

<form method="POST">
    {% csrf_token %}
    <div>
      <label>num_1:</label>
      <input type="text" name="num_1" value="1" placeholder="Enter value" />
    </div>
    <div>
      <label>num_2:</label>
      <input type="text" name="num_2" value="2" placeholder="Enter value" />
    </div>
    <br />
    <div>{{ result }}</div>
    <button type="submit">Submit</button>
</form>

在你的views.py:

def post_list(request):
    result = 0
    if request.method == "POST":
        num1 = request.POST.get('num_1')
        num2 = request.POST.get('num_2')
        result = int(num1) + int(num2)
        print(request.POST)
        print(result)

    context = {
        'result': result
    }
    return render(request, 'blog/post_list.html', context)
  

这里是前端:

和终端:

【讨论】:

  • 谢谢它的工作。我想知道单击提交后如何防止页面重新加载。我希望页面直接显示结果而不刷新。我尝试添加 "" 页面没有刷新,但结果也没有刷新实际结果值终端显示它。
  • 顺便说一句,{% csrf_token %} 是干什么用的?
  • @Jack:嗨,杰克,该值需要加载以更新新值。但是如果你不想加载整个页面,你可以使用 AJAX 或 websocket 来更新实时数据。 {% csrf_token %} 用于防御 CSRF 攻击。你可以在这里看到更多:docs.djangoproject.com/en/4.0/ref/csrf
  • 你能举个例子吗?这是否意味着我必须放弃使用 django 框架?
  • @Jack:你可以关注这个视频youtube.com/watch?v=6TXtsTutoQQ或搜索google关键字AJAX in Django。仅在此评论中解释起来很复杂。
猜你喜欢
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 2022-09-25
相关资源
最近更新 更多