如何在 Django 视图之间传递数据
How to pass data between django views
This 问题大致解决了我的问题,但我正在寻找更具体的解释。
我希望用户更新一组模型对象,但是,需要先检索这些对象的查询集。我的计划是在两个单独的 URs/views 中执行此操作,从第一个获取查询集信息,然后显示接下来要更新的模型表单集。
我的第一个视图给出了所有 "Project" 的列表(我的一个模型),并检索所选项目的 ID。
表格如下:
class ProjectLookupForm(forms.Form):
Project_Name = chosenforms.ChosenModelChoiceField(queryset=Project.objects.all())
这里是视图:
def update_project_filter(request):
project_form = ProjectLookupForm(request.POST or None)
if request.method == 'POST':
if project_form.is_valid():
context = {"project_form":project_form}
# Get project here and share it with the next view.
selected_project_id = project_form.cleaned_data["Project_Name"].id
# Add a new return statement here?
# Or call update project view from here?
# Add a redirect button to html?
else:
errors = project_form.errors
context = {"errors":errors, "project_form":project_form}
else:
context = {"project_form":project_form}
return render(request, 'filter_update_project_form.html', context)
如您所见,我已经包含了一些集思广益我的可能性的评论。我的目标是将 selected_project_id 发送到下一个视图,以便它可以将该 id 用作模型表单查询集。
def update_project(request):
UpdateFormset = modelformset_factory(Sample, fields=("sample_name", "extraction_date",
"project", "order", "notebook", "notebook_page"))
if request.method == 'POST':
formset = UpdateFormset(request.POST, request.FILES)
if formset.is_valid():
formset.save()
context = {"formset": formset, "project_form":project_form}
else:
errors = formset.errors
context = {"formset":formset, "errors":errors, "project_form":project_form}
else:
formset = UpdateFormset(queryset=Sample.objects.filter(project=2))
context = {"formset":formset, "project_form":project_form}
return render(request, 'update_project_form.html', context)
你可以在这里看到我已经像这样对查询集进行了硬编码:
queryset=Sample.objects.filter(project=2)
如何将 "project=" 设置为我的 selected_project_id?我是否将此信息作为输入参数传递给视图?还是我将它发送到下一个 URL 然后从那里拿走?
假设您已经激活 django.contrib.sessions.middleware.SessionMiddleware
;您可以使用 request.session
字典在视图之间传递数据,如下所示:
def update_project_filter(request):
...
selected_project_id = project_form.cleaned_data["Project_Name"].id
request.session['selected_project_id'] = selected_project_id
...
def update_project(request):
...
selected_project_id = request.session.get('selected_project_id')
...
This 问题大致解决了我的问题,但我正在寻找更具体的解释。
我希望用户更新一组模型对象,但是,需要先检索这些对象的查询集。我的计划是在两个单独的 URs/views 中执行此操作,从第一个获取查询集信息,然后显示接下来要更新的模型表单集。
我的第一个视图给出了所有 "Project" 的列表(我的一个模型),并检索所选项目的 ID。
表格如下:
class ProjectLookupForm(forms.Form):
Project_Name = chosenforms.ChosenModelChoiceField(queryset=Project.objects.all())
这里是视图:
def update_project_filter(request):
project_form = ProjectLookupForm(request.POST or None)
if request.method == 'POST':
if project_form.is_valid():
context = {"project_form":project_form}
# Get project here and share it with the next view.
selected_project_id = project_form.cleaned_data["Project_Name"].id
# Add a new return statement here?
# Or call update project view from here?
# Add a redirect button to html?
else:
errors = project_form.errors
context = {"errors":errors, "project_form":project_form}
else:
context = {"project_form":project_form}
return render(request, 'filter_update_project_form.html', context)
如您所见,我已经包含了一些集思广益我的可能性的评论。我的目标是将 selected_project_id 发送到下一个视图,以便它可以将该 id 用作模型表单查询集。
def update_project(request):
UpdateFormset = modelformset_factory(Sample, fields=("sample_name", "extraction_date",
"project", "order", "notebook", "notebook_page"))
if request.method == 'POST':
formset = UpdateFormset(request.POST, request.FILES)
if formset.is_valid():
formset.save()
context = {"formset": formset, "project_form":project_form}
else:
errors = formset.errors
context = {"formset":formset, "errors":errors, "project_form":project_form}
else:
formset = UpdateFormset(queryset=Sample.objects.filter(project=2))
context = {"formset":formset, "project_form":project_form}
return render(request, 'update_project_form.html', context)
你可以在这里看到我已经像这样对查询集进行了硬编码:
queryset=Sample.objects.filter(project=2)
如何将 "project=" 设置为我的 selected_project_id?我是否将此信息作为输入参数传递给视图?还是我将它发送到下一个 URL 然后从那里拿走?
假设您已经激活 django.contrib.sessions.middleware.SessionMiddleware
;您可以使用 request.session
字典在视图之间传递数据,如下所示:
def update_project_filter(request):
...
selected_project_id = project_form.cleaned_data["Project_Name"].id
request.session['selected_project_id'] = selected_project_id
...
def update_project(request):
...
selected_project_id = request.session.get('selected_project_id')
...