Django - 重定向传递的字典未在模板中显示

时间:2015-08-28 15:40:26

标签: python django

我正在尝试在保存值后将我的注册表单重定向到同一表单,我也想在重定向响应中返回一个字典。 但是以下代码无效。

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>           

1 个答案:

答案 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')