如何在Django中重定向时传递extra_context

时间:2012-06-01 12:50:09

标签: django django-forms django-templates django-views

我的views.py:

 @login_required
 def some_views(request):
     if request.method == 'POST':
         form = AddressCreateFrom(request.POST)
         if form.is_valid():
             name = form.cleaned_data['Address']
             ip_value = form.cleaned_data['value']
             user_list = get_username(name)
             address_create = form.save()
             extra_context = {
                 'user_list': user_list
                 }
             return redirect_to(request, url=address_create.get_absolute_url())
     else:
         form = AddressCreateFrom()
     extra_context = {
         'form':AddressCreateFrom(initial={'user': request.user.pk})
         }
     return direct_to_template(request,'networks/user_form.html',extra_context)

在form.py中:

 class AddressCreateFrom(forms.ModelForm):
     Address = forms.CharField(max_length=40)
     value = forms.CharField(max_length=40)
     class Meta:
         model = Network
         widgets = {
             'user': forms.HiddenInput()
           }

如您所见,我正在使用带有两个额外Django表单字段的Django模型表单,即Address and value类中的AddressCreateForm。我在渲染模板时需要所有字段。

确实some_views方法工作正常,但我还希望将context_dictionaryuser_list中写入的一些额外数据呈现给请求URL,即address_create.get_absolute_url()。< / p>

如果我没有错,如果我们处理数据库,我们必须使用redirect_to方法。有可能吗?

2 个答案:

答案 0 :(得分:3)

重定向将返回状态代码为301或302的HTTP响应,以及重定向到的位置:

301 MOVED PERMANENTLY
Location: http://www.example.com/new-url/

原始视图没有呈现模板,因此您无法将extra_context传递给它。

用户浏览器通常会遵循重定向,并请求新的网址。

如果要在下一个视图中显示有关特定用户的信息,您必须执行以下操作:

  1. 设计您的网址格式以包含用户ID,例如/users/200/
  2. 将其包含为get参数,例如视图中/users/?id=200, then fetch the user id from request.GET`。
  3. 将user_id存储在会话中
  4. 在重定向之前,请使用用户数据messages framework创建消息。
  5. 然后在您重定向到的视图中,您可以从数据库中获取用户,并将其添加到模板上下文中。

答案 1 :(得分:1)

上下文,额外上下文和POST数据将无法在重定向中存活。

这是你可以做的。

# before the redirect
....
request.session['user_list'] = user_list
return redirect_to(request, url=address_create.get_absolute_url())

# after the redirect (in the views.py that handles your redirect)
....
user_list = request.session['user_list']
extra_context = { 'user_list': user_list }
....
# now you have the user_list in the extra_context and can send it to the rendering engine.

注意:此解决方案仅适用于您自己服务器中的重定向。