我正在尝试围绕如何在 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() 中再次运行昂贵的操作?还是只是重构代码的问题?
(希望问题的解释不会太混乱!)