1

我正在尝试围绕如何在 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() 的结果,这样我就不必在 confirm() 中再次运行昂贵的操作?还是只是重构代码的问题?

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

4

1 回答 1

3

有三种方法可以做到

  1. 缓存结果
  2. 将结果存储在用户的会话中
  3. 在表单中包含相关信息 - 使用隐藏或只读字段。
于 2012-11-28T20:55:52.490 回答