Django - 无法在HttpResponseRedirect中传递参数

时间:2014-10-04 21:50:44

标签: python django django-views

我已经读过,在成功处理发布数据后,您应该使用HttpResponseRedirect重定向到另一个页面。我正在为学习目的构建一个URL缩短器,来自views.py的代码如下所示:(不工作)

def makeurl(request):
    # get url from form
    post_url = request.POST['url']
    # shorten the url and have the short code returned
    shortened_url = shorten_url(post_url)
    return HttpResponseRedirect('create')    

def create(request):
    return render(request, 'shorturl/create.html',
        {'shortened_url': shortened_url}) 

当我的表单被提交以缩短输入URL时,会调用'makeurl',其中计算并返回缩短的URL(shortened_utl)。然后我调用'create',它将呈现'shortened_url需要向用户显示的页面。

问题是,如果我要使用HttpResponseRedirect,我无法将'shortened_url'变量传递给我的'create'视图进行渲染。任何人都可以建议我吗?我是django的新手,欢呼声

1 个答案:

答案 0 :(得分:4)

您可以使用重定向轻松传递参数,至少有三种方式:

  1. 作为命名参数段
  2. 作为查询字符串参数
  3. 作为会话变量
  4. 让我们说你的"创造" view采用名为" shortened_url"的参数。使用方法1的URL如下所示:

    # urls.py
    url(r'create/(?P<shortened_url>.)/$', create, name='create',)
    
    
    # views.py
    def create(request, shortened_url):
        # do whatever
    

    在处理表单帖子的视图中,您可以执行以下操作:

    from django.core.urlresolvers import reverse
    
    def makeurl(request):
        . . .
        return HttpResponseRedirect(reverse('create', args=(),
            kwargs={'shortened_url': shortened_url}))
    

    如果是方法2,你根本不需要url模式中的命名参数,而只需反转url模式并添加querystring参数:

    def makeurl(request):
        . . .
        url = reverse('create')
        url += '?shortened_url={}' + shortened_url
        return HttpResponseRedirect(url)
    

    如果是方法3,则不需要命名参数或查询字符串值:

    def makeurl(request):
        . . .
        request.session['shortened_url'] = shortened_url
        return HttpResponseRedirect(reverse('create'))
    
    def create(request):
        shortened_url = request.session.get('shortened_url')
        . . .
    
        # delete the session value
        try:
            del session['shortened_url']
        except KeyError:
            pass
    
        # do whatever