簡體   English   中英

Django - 將 Session 變量從一個視圖傳遞到另一個視圖(“請求”未定義)

[英]Django - Pass Session Variables From One View To Another ('request' is undefined)

我已經看過這個( 從 session 到另一個視圖的 django 變量),但我相信期望的結果是完全不同的。

我的views.py 文件中有兩個視圖:projectcreation 和projectconfirm。 用戶在 projectcreation 視圖中填寫表格后,我希望他們被引導到一個確認頁面,該頁面在繼續創建項目之前提供變量的只讀視圖。

我的 views.py 文件如下所示:

from django.shortcuts import render
from django.http import HttpResponse
from .projectform import ProjectForm
from .projectconfirm import ProjectConfirm

def projectcreation(request):
    if request.method == 'POST':
        form = ProjectForm(request.POST)
        if form.is_valid():
            request.session['projectname'] = form.cleaned_data['client'] + "-" + form.cleaned_data['stage'] + "-" + form.cleaned_data['purpose']
            request.session['computeapi'] = form.cleaned_data['computeapi']
            request.session['deploymentmanapi'] = form.cleaned_data['deploymentmanapi']
            request.session['storagecompapi'] = form.cleaned_data['storagecompapi']
            request.session['monitorapi'] = form.cleaned_data['monitorapi']
            request.session['loggingapi'] = form.cleaned_data['loggingapi']
            return render(request,'projectconfirm.html')
    else:
        form = ProjectForm()
    return render(request, 'projectform.html', {'form': form})

def projectconfirm(request):
    if request.method =='POST':
        print("Now beginning deployment...")
    else:
        form = ProjectConfirm()
    return render(request, 'projectconfirm.html', {'form': form})

我面臨並且承認不理解的問題是如何在 projectconfirm.py 腳本中加載 session 變量。 我認為像下面這樣的東西會起作用,但它抱怨“請求”是一個未定義的變量:

from django import forms
from django.shortcuts import render
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Submit, Row, Column, Field, Fieldset

class ProjectConfirm(forms.Form):
    name = forms.CharField(widget=forms.TextInput(attrs={'placeholder': request.session['projectname']}))
    computeapi = forms.CharField(widget=forms.TextInput(attrs={'placeholder': request.session['computeapi']}))
    deploymentmanapi = forms.CharField(widget=forms.TextInput(attrs={'placeholder': request.session['deploymentmanapi']}))
    storagecompapi = forms.CharField(widget=forms.TextInput(attrs={'placeholder': request.session['storagecompapi']}))
    monitorapi = forms.CharField(widget=forms.TextInput(attrs={'placeholder': request.session['monitorapi']}))
    loggingapi = forms.CharField(widget=forms.TextInput(attrs={'placeholder': request.session['loggingapi']}))

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.layout = Layout(
            Fieldset(
                'Project Name',
                Row(
                    Column('name', css_class='form-group col-md-4 mb-0', readonly=True),
                )
            ),
            Fieldset(
                'APIs To Enable',
                Row(
                    Column('computeapi', css_class='form-group col-md-4 mb-0', readonly=True),
                    Column('deploymentmanapi', css_class='form-group col-md-4 mb-0', readonly=True),
                    Column('storagecompapi', css_class='form-group col-md-4 mb-0', readonly=True),
                    Column('monitorapi', css_class='form-group col-md-4 mb-0', readonly=True),
                    Column('loggingapi', css_class='form-group col-md-4 mb-0', readonly=True)
                )
            ),
            Submit('Deploy', 'Deploy', css_class='btn-success')
        )

在表單request的構造函數中可以通過以下方式獲得:

  1. 通過**kwargs傳遞它,所以:
# in your view:
form = ProjectConfirm(request=request)

# in ProjectConfirm
class ProjectConfirm(forms.ModelForm):
    name = forms.CharField(widget=forms.TextInput(attrs={}))
    # etc

    def __init__(self, *args, **kwargs):
        request = kwargs.pop("request")
        super().__init__(*args, **kwargs)
        # ... and then define your widgets inside your __init__
        self.fields['name'].widget.attrs['placeholder'] = request.session["projectname"]
        # etc
  1. 通過將 Form 定義為視圖的嵌套 class,但它必須是類視圖而不是 function。然后你可以將它傳遞給你的表單,但它仍然不是一個優雅的解決方案,因為它是混合視圖和 ZAC68B423ABFD6A9FE26EAC8888 中的混合模塊。 無論如何,它會是這樣的:
class YourView(FormView):
    def get_form_class(self):
        request = self.request
        class ProjectConfirm(forms.Form):
            # your existing form definition
        return ProjectConfirm

讓我知道它是否對您有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM