重复使用上一个视图的搜索结果

时间:2012-11-28 20:27:15

标签: django django-views

我试图在Django中解决如何执行以下操作:

假设我有一个视图接受带有搜索参数的GET请求,例如:

def search(request, id):
    another_model = get_object_or_404(models.AnotherModel, id=id)
    if request.method == 'GET' and 'submit' in request.GET:
        result = {}

        # Expensive db operation to filter based on search query
        # Populates result

        return render(request, "result.html", {
            'result': result,
            'form': forms.ConfirmationForm(another_model=another_model)})

    form = forms.SearchForm(None, another_model=another_model)

    return render(request, "search.html", {'form': form})

当收到搜索查询时,它会根据GET参数执行一些昂贵的数据库操作。结果和表单将传递给模板进行渲染。

在模板中,表单操作设置为发布到不同的视图:

def confirm(request, id):
    another_model = get_object_or_404(models.AnotherModel, id=id)
    form = forms. ConfirmationForm(request.POST or None)
    if form.is_valid():
        form.save()
        return redirect('done', id)    

    # How to:
    # return render(request, "result.html", {
    #    'result': result,
    #    'form': forms.ConfirmationForm(another_model=another_model)})

到目前为止,confirm()仅在表单有效时才有效。我奋斗的地方是如何“重新创造” 如果表单失败,则在confirm()内基于先前搜索查询的响应。 我是否必须以某种方式缓存来自search()的结果,因此我不必运行昂贵的 再次在确认()中操作?或者仅仅是重组代码的问题?

(希望问题的解释不会太混乱!)

1 个答案:

答案 0 :(得分:3)

有三种方法可以做到这一点

  1. 缓存结果
  2. 将结果存储在用户会话中
  3. 在表单中包含相关信息 - 使用隐藏或只读字段。