【问题标题】:How to pass extra_context when redirecting in Django在Django中重定向时如何传递extra_context
【发布时间】:2012-06-06 17:08:24
【问题描述】:

我的意见.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 模型表单,即 AddressCreateForm 类中的 Address and value。我在渲染模板时需要所有字段。

确实some_views 方法工作正常,但我还想将一些用context_dictionaryuser_list 写入的额外数据呈现给请求URLaddress_create.get_absolute_url()

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

【问题讨论】:

  • 你到底想做什么? extra_context 应该是做什么用的?为什么重定向需要任何类型的上下文?
  • @DanielRoseman 我正在尝试将带有网络模型字段的 uesr_list 变量(它是一个列表数据类型)传递给模板。在基于 Address 和 ip_value 字段进行一些计算后,我得到了这个 user_list。如果我这样做了,那么我无法将 user_list 变量渲染到模板
  • -1 表示“什么”。我在问诀窍。这个问题有问题吗
  • 什么模板?您正在重定向,而不是呈现模板。

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


【解决方案1】:

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

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

原始视图没有渲染模板,所以不能将extra_context传递给它。

用户的浏览器通常会跟随重定向,并请求新的 URL。

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

  1. 设计您的 URL 模式以包含用户 ID,例如/users/200/,
  2. 将其作为获取参数包括在内,例如/users/?id=200,然后从视图中的request.GET 获取用户 ID。
  3. 将 user_id 存储在会话中
  4. 在重定向之前,使用messages framework 使用用户数据创建消息。

然后在您重定向到的视图中,您可以从数据库中获取用户,并将其添加到模板上下文中。

【讨论】:

    【解决方案2】:

    上下文、额外上下文和 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.
    

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

    【讨论】:

      猜你喜欢
      • 2017-11-30
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 2019-08-02
      • 1970-01-01
      • 2011-04-18
      • 2019-09-12
      相关资源
      最近更新 更多