Django-将会话变量从一个视图传递到另一个视图('request'是未定义的)

问题描述 投票:0回答:1

我已经看过这个(django variable of one view to another from session),但是我认为期望的结果是完全不同的。

我的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脚本中加载会话变量。我认为类似以下内容的方法会起作用,但它抱怨“请求”是未定义的变量:

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')
        )
python django variables readonly django-crispy-forms
1个回答
0
投票

在表格request的构造函数中可以通过以下方式获得:

  1. 通过**kwargs,因此:
# in your view:
form = ProjectConfirm(request=request)

# in ProjectConfirm.__init__
def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    request = kwargs.get("request")
    # ... and then define your widgets inside your __init__
    self.fields['name'].widget.attrs['placeholder'] = request.session["projectname"]
    # etc
  1. 通过将Form定义为视图的嵌套类,但它必须是class-view而不是function。然后,您可以将其传递给表单,但这并不是一个优雅的解决方案,因为它在同一模块中混合了视图和表单。无论如何都会是这样:
class YourView(FormView):
    def get_form_class(self):
        request = self.request
        class ProjectConfirm(forms.Form):
            # your existing form definition
        return ProjectConfirm

让我知道是否对您有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.