我正在尝试在保存值后将我的注册表单重定向到同一表单,我也想在重定向响应中返回一个字典。 但是以下代码无效。
urls.py
url(r'^signupform/$', views.render_signup, name='render_signup'),
url(r'^signup/$', views.sign_up_account_admin, name='sign_up_account_admin'),
views.py
def render_signup(request):
"""
"""
data_dict = {"some_keys":"some_values"}
return render(request, "admin.html", data_dict)
def sign_up_account_admin(request):
"""
"""
user = None
user, msg = save_form_data(request)
req_dict = {"msg": msg}
if user:
ret = redirect('homepage') #-- This works pretty fine
else:
ret = redirect('/signupform/', resp = req_dict) #-- This redirects but I don't get the `resp` Objects in the template
return ret
Html Temlpate
<div class="container">
=={{resp}}
===>>>>>>>{{resp.msg}}
</div>
输出HTML
<div class="container">
==
===>>>>>>>
</div>
答案 0 :(得分:4)
您无法将随机kwargs
传递给redirect
函数。
传递给redirect
的参数与您使用reverse()
生成网址时传递的位置或关键字参数相同。这些参数用于反向解析网址。
正如Django关于使用redirect()
function.
通过传递视图的名称和可选的一些位置或 关键字参数;使用的URL将反向解析
reverse()
方法。
现在,当您传递一个硬编码的网址时,随之传递的参数将被丢弃。
在Django docs中提到的将redirect()
与硬编码网址一起使用的推荐方法是:
def my_view(request):
...
return redirect('/some/url/')
因此,您现在可以使用的是Django会话,或者可以在网址中传递参数,以便在resp
视图中访问render_signup
的值。
解决方案-1使用Django会话
一种方法是使用Django会话来获取msg
。
def sign_up_account_admin(request):
"""
"""
user = None
user, msg = save_form_data(request)
req_dict = {"msg": msg}
if user:
ret = redirect('homepage') #-- This works pretty fine
else:
request.session['resp'] = msg # set in session
ret = redirect('/signupform/')
return ret
然后在render_signup
视图中,您可以执行以下操作:
def render_signup(request):
"""
"""
resp = request.session.get('resp') # get the value from session
data_dict = {'resp': resp, ..}
return render(request, "admin.html", data_dict)
解决方案-2将其作为网址参数传递
另一种解决方案是将其作为查询参数传递给url。
ret = redirect('/signupform/?resp=%s'%msg) # pass as query parameter
然后在render_signup
视图中,从request.GET
获取此值。
resp = request.GET.get('resp') # get the value of 'resp' from request.GET
data_dict = {'resp':resp, ..}
修改强>
如果您要在字典中发送多个参数,则可以使用urllib.urlencode()
对字典进行编码并使用网址发送。
encoded_string = urllib.urlencode(my_dict)
redirect('/signupform/?%s'%encoded_string) # attach the encoded string in the url
然后在您的视图中,您可以从request.GET
检索词典的键。
value1 = request.GET.get('key1')
value2 = request.GET.get('key2')