web-dev-qa-db-ja.com

Djangoビュー間でデータを渡す方法

This 質問は私の質問に一般的に対処しますが、より具体的な説明を探しています。

ユーザーにモデルオブジェクトのグループを更新してもらいたいのですが、これらのオブジェクトのクエリセットを最初に取得する必要があります。私の計画は、これを2つの別々のUR /ビューで実行し、最初からクエリセット情報を取得してから、次に更新するモデルフォームセットを表示することです。

私の最初のビューは、すべての「プロジェクト」(私のモデルの1つ)のリストを提供し、選択されたプロジェクトの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に送信して、そこから取得しますか?

12
Malonge

アクティベートしたと仮定します 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')
    ...
22
ozgur