2016-03-01 44 views
1

我有一个简单的Django网站,我想从第一个框中传递数据,并将该值加5返回到页面上的第二个表单框。我后来打算用第一个数值来做数学,但这会让我开始。我在检索表单数据时遇到了很多问题。我知道我需要在我的views.py文件中创建一个函数来处理表单,并且我需要在URLs.py中添加一些内容来检索表单数据。我已经尝试了所有的教程等,但无法弄清楚。Django无法处理HTML表单数据

我的html模板是一个简单的页面,它有一个带有两个字段和提交按钮的窗体。 Django runserver拉起html页面就好了。这里是我的代码:

Views.py

from django.shortcuts import render 
from django.http import HttpResponse 
from django.template import loader 
from django import forms 

def index(request): 
    return render(request, 'brew/index.html') 

#Here I want a function that will return my form field name="input", 
#and return that value plus 5 to the form laveled name="output". 
#I will later us my model to do math on this, but I cant get 
#this first part working 

urls.py

from django.conf.urls import url 
from . import views 

urlpatterns = [ 
    url(r'^$', views.index, name='index'),  
] 

这里是我的HTML模板的index.html:

<html> 
<head> 
<title>Gravity Calculator</title> 
</head> 
<body> 
<h1>Gravity Calculator</h1> 
<p>Enter the gravity below:</p> 
<form action="/sendform/" method = "post"> 
    Enter Input: <br> 
    <input type="text" name="input"><br> 
    <br> 
    Your gravity is: <br> 
    <input type="text" name="output" readonly><br> 
    <br> 
    <input type="submit" name="submit" >   
</form> 
</body> 
</html> 

回答

1

您需要将结果填充到模板可以访问的上下文变量。

观点:

def index(request): 
    ctx = {} 
    if request.method == 'POST' and 'input' in request.POST: 
     ctx['result'] = int(request.POST.get('input', 0)) + 5 
    return render(request, 'brew/index.html', ctx) 

然后在你的模板:

<html> 
<head> 
<title>Gravity Calculator</title> 
</head> 
<body> 
<h1>Gravity Calculator</h1> 
<p>Enter the gravity below:</p> 
<form action="/sendform/" method = "post"> 
    Enter Input: <br> 
    <input type="text" name="input"><br> 
    <br> 
    Your gravity is: <br> 
    <input type="text" name="output" value="{{ result }}" readonly><br> 
    <br> 
    <input type="submit" name="submit" >   
</form> 
</body> 
</html> 

看起来,你是很新的Django的,我建议:基于

  • 使用方法的意见,直到你很舒服吧,那么
  • 开始使用基于类的v IEWS,优点是代码的可重用,但最终的基于类的观点吐出视图方法,有良好的 参考站点是ccbv.co.uk
  • 使用形式类
+0

感谢您的响应。你是对的,我有一些基本的python经验,但对Django来说是新的,并且正在为之付出努力。在使用您的建议之后,我现在正在使用BrewSite.urls中定义的URLconf,Django尝试使用这些URL模式,顺序如下: ^ brew/ ^ admin/ 当前URL sendform /不匹配这些。”我需要添加一些东西到urls.py?我尝试在我的模板中删除action =“/ sendform”,但后来我得到了“失败的原因:CSRF令牌丢失或不正确。”。如果我将操作更改为/ brew /,也会得到同样的结果。 –

+0

我认为这超出了你的问题,你需要在你的表单中放置'{%csrf_token%}',这会产生一个带有标记的隐藏输入字段。关于您的网址问题,您项目文件夹中的主要urls.py需要包含您的应用程序的urls.py,请在这里查看我的视频https://www.youtube.com/watch?v=c3C3hYbo37c –

+0

将该行添加到我的模板形式做到了!非常感谢帮助,现在我终于可以继续了。 –