0

我正在尝试找到一种稍后使用用户提供的变量的好方法。我已将其简化为这个最小的示例:

模型.py

class Input(models.Model):
    x = models.IntegerField()

class InputForm(ModelForm):
    class Meta:
        model = Input

视图.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)

推荐的方法是什么?

编辑:

主要问题似乎是results函数中的request.GET dict是空的,即

def results(request):
    return HttpResponse(request.GET)

只显示一个空白页面。然后当然 request.GET['x'] 给出了异常“Key 'x' not found in QueryDict: {}”。我的 input.html 看起来像这样:

<form method="post" action="">{% csrf_token %}
    {{ form }}
    <input type="submit" value="Compute" />
</form>

理想情况下,我希望能够将 request.GET 发送回 InputForm,就像在 FallenAngel 的原始答案中一样,但它不起作用,因为 request.GET 是空的。

4

2 回答 2

0

您可以使用会话来保存从一个视图到下一个视图的值。会话有许多数据存储方式的后端,因此请选择最适合您的架构的后端。

于 2013-02-19T15:51:57.647 回答
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是类似字典的对象。(在 Django 中请求 GET 和 POST 对象)。所以:

request.GET['x']

或者

request.GET.get('x') 

会为你工作。

于 2013-02-19T16:16:11.777 回答