【发布时间】:2020-01-15 20:09:30
【问题描述】:
我有一个家,我有一个表格,我可以从学生那里获得一些信息,向他们推荐一些可以申请的课程。主视图如下:
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
return redirct(programs)
else:
my_form = MyModelForm()
home_context.update({'my_form': my_form, })
return render(request, template_name, home_context)
这种替代策略的问题是我在程序视图中看不到 my_form 专注于主页中提交的数据。 我想得到一个好坏参半的结果。预先占用表单并查看 URL 更改为“example.com/programs”。 注意:我没有显示 url 模式和模板中写的内容,我希望这些是隐含的。 我期望的是一个不向会话添加信息的解决方案。我只想将 POST 请求传递给程序视图。 如果没有办法不向会话中添加数据,那么向会话中添加数据的最佳方法表示赞赏。
请注意,当在主页中按下表单提交按钮时,我想引用程序视图的 request.POST。这是我目前正在使用的备选方案 1 的一个积极点。
在第一种方法中,如果我输入“example.com/programs”,则会触发程序视图的获取部分,如果我在主页上提交表单,则会触发主页视图的获取部分,然后是 POST部分程序视图被触发。这是我想要的行为。
【问题讨论】:
标签: django forms redirect view request