Python 如何在Django中获取一个视图到另一个视图的上下文
我想在我的创建表单视图中添加上下文,但是我得到了 UnboundLocalError:赋值前引用的局部变量“range” create\u form视图的上下文应在create\u test\u bills中可用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
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')
请始终发布完整的错误消息并进行完整的回溯。同时修复你的缩进。请始终发布完整的错误消息并进行完整的回溯。还要修复缩进。