我有一所房子,里面有一张可以从学生那里获得一些信息的表格,以建议他们一些可以应用的程序。主页视图如下:
def home(request):
template_name = 'home.html'
home_context = {}
if request.POST:
my_form = MyModelForm(request.POST)
if my_form.is_valid():
# do some stuff
return programs(request)
else:
my_form = MyModelForm()
home_context.update({'my_form': my_form, })
return render(request, template_name, home_context)
在第二个视图中,我具有相同的表单,并且希望该表单被我在主页中输入的信息所占据。这就是为什么在上面将POST请求传递给程序视图的原因,如下所示:
def programs(request):
template_name = 'programs.html'
programs_context = {}
if request.POST:
my_form = MyModelForm(request.POST)
if my_form.is_valid():
# do some other stuff
else:
my_form = MyModelForm()
programs_context.update({'my_form': my_form, })
return render(request, template_name, programs_context)
此策略的缺点(将主视图中的POST请求传递到programs_view)是,网址栏中的网址不会更改为“ example.com/programs”,而是保持为“ example.com”。我将遇到一些问题,包括程序的分页问题。 另一种选择是我这样做:
def home(request):
template_name = 'home.html'
home_context = {}
if request.POST:
my_form = MyModelForm(request.POST)
if my_form.is_valid():
# do some stuff
querystring = request.POST
return redirect(reverse('programs') + '?' + parse_qs(querystring, keep_blank_values=True))
else:
my_form = MyModelForm()
home_context.update({'my_form': my_form, })
return render(request, template_name, home_context)
首先,执行此操作时出现错误:“ QueryDict”对象没有属性“ decode”
第二,我不知道要在程序视图中做什么以利用要发送到程序视图的get分支的查询。
第三,如果它是来自重定向而不是来自独立的直接get请求,则需要在程序视图的get分支中的程序视图的post分支中做过的工作。如何在程序获取请求中区分这一点?
总体上,我们高度赞赏任何替代解决方案和帮助。
答案 0 :(得分:0)
使用request.GET ['your_key']获取在查询字符串中传递的数据。
您可以选中this SO answer。
答案 1 :(得分:0)
这根本不是parse_qs
所做的。解析是将字符串(即查询字符串)转换为可用的对象;相反,您需要做的是,将POST转换为查询字符串;即对其进行编码,而不对其进行解析。
请注意,尽管您已称之为request.POST
,但它不是查询字符串,而是QueryDict。要将dict编码为字符串,可以使用urlencode
方法:request.POST.urlencode()
但是,这仍然行不通,因为重定向始终是GET,而您的目标表单需要POST。这根本不是正确的方法。相反,我要做的是将querydict存储在会话中,然后在第二个视图中从那里使用它。
答案 2 :(得分:0)
我有一所房子,里面有一张可以从学生那里获得一些信息的表格,以建议他们一些可以应用的程序。主页视图如下:
def home(request):
template_name = 'home.html'
home_context = {}
if request.POST:
my_form = MyModelForm(request.POST)
if my_form.is_valid():
querystring = urlencode(request.POST)
return redirect(reverse('programs') + '?' + querystring)
else:
my_form = MyModelForm()
home_context.update({'my_form': my_form, })
return render(request, template_name, home_context)
在程序视图中
def programs(request):
template_name = 'programs.html'
programs_context = {}
if request.POST:
my_form = MyModelForm(request.POST)
if my_form.is_valid():
# do some other stuff
else:
# if the get is from redirect
my_form = MyModelForm(request.GET)
# do some other stuff
# else:
my_form = MyModelForm()
programs_context.update({'my_form': my_form, })
return render(request, template_name, programs_context)
我现在想通过检查请求是来自输入example.com/programs还是来自主视图的重定向部分来将程序视图的get方法划分为多个部分。这样做的标准方法是什么?上面写的if和else的标准写法是什么?