【问题标题】:DJango Persist session across 2 formsDJango Persist 跨 2 种形式的会话
【发布时间】:2017-05-25 12:15:13
【问题描述】:

我正在尝试将数据(最终是字典,用于测试我正在传递一个虚拟变量)从一种形式传递到另一种形式。它是一个多步骤形式。 为此,我使用 request.session 对象。但是,当我从第一个表单发布后,当我到达第二个表单时,会话数据为无,当我打印会话密钥时,它似乎已经改变。我正在使用基于默认数据库的会话。 我的总体目标是将数据从 form1 传递到 form2。如果有任何其他建议,我也愿意尝试一下。

参考文档 - https://docs.djangoproject.com/en/dev/topics/http/sessions/ http://gregblogs.com/dealing-with-forms-a-beginners-look-into-django-forms-and-sessions/

Settings.py

INSTALLED_APPS = (
        'django.contrib.sessions',
...
)

MIDDLEWARE_CLASSES = [
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
]

Views.py

def step1(request):
form = UploadPickFileForm(request.POST)
# Create form instance

print "Session{}".format(request.session._get_session_key())
if request.method == 'POST':
    initial = {'text':request.session.get('text', None)}
    form = UploadPickFileForm(request.POST, request.FILES, initial = initial)
    if form.is_valid():
        action = form.cleaned_data.get('action')
        uploaded_file = form.cleaned_data.get('file')
        extractor = get_upload_extractor_for_source(form.cleaned_data.get('source'))
        print "Action{}".format(action)
        if action == INGEST_ACTION:
            uploaded_file = form.cleaned_data.get('file')
            try:
                ingestable_upload = extractor.get_ingestable_upload(uploaded_file)
                context = {'ingestable_upload': ingestable_upload}
            except ParseError as e:
                return self.show_error(e)

            request.session['text'] = form.cleaned_data.get('action')
            tt = request.session.get('text', None)
            request.session.modified = True # just to force session save
            print "Session data{}".format(tt)               
            return HttpResponseRedirect(urlresolvers.reverse('step2'))
        else:
            form = UploadPickFileForm()
    else:
        print "form is INVALID {}".format(form.errors) 

return render(request,'step1.html', {'form':form})

def step2(request):    
    print "Session{}".format(request.session._get_session_key())
    form = MappedReleaseTitleForm(request.POST)  
    formset_class = formset_factory(MappedReleaseTitleForm, extra =0)
    tt = request.session.get('text', None)
    print "Session data{}".format(tt)
    if request.method == 'POST':
        formset =  formset_class(data,initial=[{'title':'HHHH'}])
        if formset.is_valid():
            data = formset.cleaned_data
            print "data is {}".format(data)        
    return render (request, 'step2.html', {'form':formset_class})

【问题讨论】:

    标签: python django forms session


    【解决方案1】:

    django-formtools (https://django-formtools.readthedocs.io/en/latest/) 可能是一个不错的选择吗?特别是“在多个网页上拆分表单”的表单向导。

    它可能有助于解决您的问题,而无需您从头开始编写!

    【讨论】:

    • 这个答案可以通过详细说明如何解决所提出的问题来改进。
    猜你喜欢
    • 2017-01-27
    • 2014-10-30
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多