【发布时间】:2020-01-16 09:33:56
【问题描述】:
我有一个家,我有一个表格,我可以从学生那里获得一些信息,向他们推荐一些可以申请的课程。主视图如下:
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 请求传递给程序视图)是 url bar 中的 url 不会更改为 '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' object has no attribute 'decode'
其次,我不知道如何在程序视图中使用我发送到程序视图的 get 分支的查询。
第三,如果它来自重定向而不是来自独立的直接获取请求,我需要在程序视图的 get 分支中的程序视图的 post 分支中执行的操作。如何在程序获取请求中区分这一点?
总的来说,我们非常感谢任何替代解决方案和帮助。
【问题讨论】:
标签: django forms redirect view