我正在努力学习Django,并且发现做相当基本的事情令人沮丧。我有以下表单类:
from django import forms
class InputForm(forms.Form):
field1 = forms.FloatField(label="First field: ")
field2 = forms.FloatField(label="Second field: ")
class OutputForm(forms.Form):
outfield = forms.FloatField(label="Result: ")
以下模板:
<form>
{{ input_form.as_ul }}
<input type="submit" class="btn" value="Submit" name="submit_button">
</form>
<form>
{{ output_form.as_ul }}
</form>
最后,以下观点:
from django.shortcuts import render
from .forms import InputForm, OutputForm
def index(request):
if request.GET.get('submit_button'):
# ?????
else:
input_form = InputForm()
output_form = OutputForm()
return render(request, 'index.html', {'input_form': input_form,
'output_form': output_form})
我想要发生的是,当我点击提交按钮时,第一个字段和第二个字段中的值会被添加并显示在结果字段中。我从调试输出中得知?????当我按下按钮时会运行注释块,但到目前为止我还没有弄清楚如何实际访问或更改我的字段中的数据。我不在乎保留这些交易的记录,所以感觉就像将它们存储在数据库中是非常难以理解的。解决这个问题的正确方法是什么?
答案 0 :(得分:1)
这里有一些工作,让我们一个接一个地阅读。
<强> 1。计算输出值
使用请求数据构建表单,验证表单,然后计算总和:
if request.GET.get('submit_button'):
input_form = InputForm(request.GET)
if input_form.is_valid():
data = input_form.cleaned_data
result = data["field1"] + data["field2"]
<强> 2。只读输出
不清楚为什么您要使用可提交的表单字段来显示由您的应用计算的数据,而不是将结果播放到常规的html&#39;标签&#39;在模板中。如果您真的想要/需要在表单字段中设置结果,我至少会将其设置为只读。有关如何执行此操作的示例,请参阅In a Django form, how do I make a field readonly (or disabled) so that it cannot be edited?。
第3。以
形式设置输出数据将输出表单/字段的initial
数据设置为您计算的结果。以下是(1)的代码:
result = data["field1"] + data["field2"]
output_form = OutputForm(initial={"outfield": result})
然后呈现您正在做的视图:
return render(
request,
'index.html',
{'input_form': input_form, 'output_form': output_form},
)
答案 1 :(得分:0)
您不需要表单来显示结果。当表单有效时,您可以从表单cleaned_data
获取值并计算result
。
def index(request):
result = None # Set to None by default
if request.GET.get('submit_button'): # The submit button was pressed
input_form = InputForm(request.GET) # Bind the form to the GET data
if input_form.is_valid():
result = input_form.cleaned_data['field1'] + input_form.cleaned_data['field2'] # Calculate the result
else:
input_form = InputForm() # Submit button was not pressed - create an unbound (blank) form
return render(request, 'index.html', {'input_form': input_form, result:result})
然后在您的模板中,添加{{ result }}
而不是输出表单。
答案 2 :(得分:0)
在字段上设置初始属性预填充它:
output_form.fields['outfield'].initial = input_form.data.get ('field1') + input_form.data.get ('field1')
实例化时,需要将request.POST或request.GET传递给OutputForm。您还应该在from上调用is_valid()并在检查它是否有效后使用cleaning_data而不是数据。