我正试图找到一种以后使用用户提供的变量的好方法。我已经把它剥离到这个最小的例子:
models.py
class Input(models.Model):
x = models.IntegerField()
class InputForm(ModelForm):
class Meta:
model = Input
views.py
def input(request):
if request.method == 'POST':
form = InputForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect('/results')
else:
form = InputForm()
return render_to_response('input.html',
{'form':form}, context_instance=RequestContext(request))
def result(request):
# Here I would like to get the input from the form, e.g.
#
# x = request.GET["x"]
#
# or
#
# inp = InputForm(request.GET)
# x = inp.x
#
# Something like this, so that I can be able to write the line below:
return HttpResponse("x = %f" % x)
建议的方法是什么?
编辑:
主要问题似乎是request.GET dict在结果函数中是空的,即
def results(request):
return HttpResponse(request.GET)
仅显示空白页面。然后当然request.GET ['x']给出异常“在QueryDict中找不到'Key'x':{}”。我的input.html看起来像这样:
<form method="post" action="">{% csrf_token %}
{{ form }}
<input type="submit" value="Compute" />
</form>
理想情况下,我希望能够将request.GET发送回InputForm,就像在FallenAngel的原始答案中一样,但它不起作用,因为request.GET是空的。
答案 0 :(得分:0)
您可以使用sessions将值从一个视图保存到下一个视图。会话有很多关于数据存储方式的后端,因此请选择最适合您的架构的后端。
答案 1 :(得分:0)
如果我没有误解你,你想要使用已发布表单的字段值而不保存。您可以使用commit=False
,因此,它只会使用元模型创建一个对象,但不会将其保存到您的数据库中:
def result(request):
inp = InputForm(request.GET)
if inp.is_valid():
my_obj = inp.save(commit=False) # do not save it to database
return HttpResponse("x = %f" % my_obj.x)
更新:如果您不需要表单验证(由于某些原因),您可以使用字典方法,因为request.POST
和request.GET
是类字典对象。 (Request GET and POST objects in Django)。所以:
request.GET['x']
或
request.GET.get('x')
会为你效劳。