如何在django视图之间传递数据

时间:2015-09-25 17:44:39

标签: python django django-forms django-views

This问题通常会解决我的问题,但我正在寻找更具体的解释。

我希望用户更新一组模型对象,但是,需要首先检索这些对象的查询集。我的计划是在两个单独的UR /视图中执行此操作,从第一个获取查询集信息,然后显示下一个要更新的模型表单集。

我的第一个视图给出了所有“项目”(我的一个模型)的列表,并检索所选项目的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并从那里获取它?

1 个答案:

答案 0 :(得分:19)

假设您已激活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')
    ...