Python 如何在Django中获取一个视图到另一个视图的上下文

Python 如何在Django中获取一个视图到另一个视图的上下文,python,django,django-forms,Python,Django,Django Forms,我想在我的创建表单视图中添加上下文,但是我得到了 UnboundLocalError:赋值前引用的局部变量“range” create\u form视图的上下文应在create\u test\u bills中可用 from django.shortcuts import render, redirect from .forms import TestForm from .models import Test from django.template.loader import get_templ

我想在我的创建表单视图中添加上下文,但是我得到了

UnboundLocalError:赋值前引用的局部变量“range”

create\u form视图的上下文应在create\u test\u bills中可用

from django.shortcuts import render, redirect
from .forms import TestForm
from .models import Test
from django.template.loader import get_template
from django.http import HttpResponse

from project.utils import render_to_pdf 

def create_form(request):
    if request.method == 'POST':
        range = request.POST.get('range')
        results = request.POST.get('results')
        unit = request.POST.get('unit')
        print(range,results,unit)
        return redirect('test_bills')

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


def create_test_bills(request,*args, **kwargs):

    if request.method == 'POST':
        range = request.GET.get('range')
        results = request.GET.get('results')
        unit = request.GET.get('unit')
    pdf = render_to_pdf('invoice.html',{'range':range,'results':results,'unit':unit,})

    return HttpResponse(pdf, content_type='application/pdf')
我的form.html模板。我已经包括了一些必填字段

<form method="POST">
    {% csrf_token %}
    <div class="container">
      <input type="text" placeholder="Range" name="range" required>
      <input type="text" placeholder="Results" name="results" required>
      <input type="text" placeholder="Unit" name="unit" required>
      <button type="submit" class="registerbtn">Register</button>
    </div>
  </form>
</body>
</html>

{%csrf_令牌%}
登记

我发现您的代码中存在许多问题。首先,您需要知道
重定向
是一个
GET
请求(至少据我所知)。因此,您使用
POST
请求将数据发送到第一个视图,并使用
GET
请求传递数据

其次,在
create\u test\u bills
视图中,检查请求方法是否为
POST
,然后尝试获取
GET
参数。所以你永远不会在这里得到你的参数

第三,在
create\u test\u bills
视图中,无论请求是否为
POST
,您都试图呈现pdf。由于重定向是一个
GET
请求,如果request.method==“POST”未被调用,您将得到您看到的错误,则在
下面请求您的代码

为了传递参数,我看到了两种方法。一种方法是在“创建表单”视图中构造重定向url,例如:

def create_form(request):
    if request.method == 'POST':
        range = request.POST.get('range')
        results = request.POST.get('results')
        unit = request.POST.get('unit')
        print(range,results,unit)
        url = reverse('test_bills')+'?range=%s&results=%s&unit=%s' % (range, results, unit)
        return redirect(url)

    return render(request,'form.html',{})
第二种方法是使用会话存储POST数据,如SO POST中所述,例如

def create_form(request):
    if request.method == 'POST':
        request.session['_my_data'] = request.POST
        return redirect('test_bills')

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

def create_test_bills(request):

    data = request.session.get('_my_data')
    pdf = render_to_pdf('invoice.html',{'range':data['range'],'results':data['results'],'unit':data['unit'],})

    return HttpResponse(pdf, content_type='application/pdf')

我在您的代码中看到了一些问题。首先,您需要知道
重定向
是一个
GET
请求(至少据我所知)。因此,您使用
POST
请求将数据发送到第一个视图,并使用
GET
请求传递数据

其次,在
create\u test\u bills
视图中,检查请求方法是否为
POST
,然后尝试获取
GET
参数。所以你永远不会在这里得到你的参数

第三,在
create\u test\u bills
视图中,无论请求是否为
POST
,您都试图呈现pdf。由于重定向是一个
GET
请求,如果request.method==“POST”
未被调用,您将得到您看到的错误,则在
下面请求您的代码

为了传递参数,我看到了两种方法。一种方法是在“创建表单”视图中构造重定向url,例如:

def create_form(request):
    if request.method == 'POST':
        range = request.POST.get('range')
        results = request.POST.get('results')
        unit = request.POST.get('unit')
        print(range,results,unit)
        url = reverse('test_bills')+'?range=%s&results=%s&unit=%s' % (range, results, unit)
        return redirect(url)

    return render(request,'form.html',{})
第二种方法是使用会话存储POST数据,如SO POST中所述,例如

def create_form(request):
    if request.method == 'POST':
        request.session['_my_data'] = request.POST
        return redirect('test_bills')

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

def create_test_bills(request):

    data = request.session.get('_my_data')
    pdf = render_to_pdf('invoice.html',{'range':data['range'],'results':data['results'],'unit':data['unit'],})

    return HttpResponse(pdf, content_type='application/pdf')
请始终发布完整的错误消息并进行完整的回溯。同时修复你的缩进。请始终发布完整的错误消息并进行完整的回溯。还要修复缩进。