2014-10-04 95 views
1

我讀過,成功處理髮布數據後,您應該使用HttpResponseRedirect重定向到另一個頁面。我建設學習目的的網址縮短服務,從views.py的代碼如下所示:(不工作)Django - 無法在HttpResponseRedirect中傳遞參數

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的,歡呼聲

回答

3

你可以通過輕鬆的參數使用重定向至少在三個方面:

  1. 作爲命名的參數段
  2. 作爲查詢字符串參數
  3. 作爲一個會話變量

假設您的「創建」視圖採用了一個名爲「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模式和策略:

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 
+0

所以我真的不希望縮短的URL在URL中可見,是你的解決方案的情況?歡呼聲 – 2014-10-04 22:41:19

+0

是的。如果您不希望它可見,則可以將其暫時存儲在會話中。我已經添加了第三個示例。 – Brandon 2014-10-04 22:48:10

+0

啊我看到了,我還沒有看看會議。它們是在頁面之間傳遞數據的正確/可接受的方式嗎?謝謝 – 2014-10-04 22:52:34