我试图在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()的结果,因此我不必运行昂贵的 再次在确认()中操作?或者仅仅是重组代码的问题?
(希望问题的解释不会太混乱!)
答案 0 :(得分:3)
有三种方法可以做到这一点