2014-01-14 85 views
2

如何使用Django的Reverse與信息的可選參數?我不斷獲取Django HTTPResponseRedirect&Reverse與可選參數

views.py:

def cartForm(request, prod): 
    if request.method=="POST": 
     quantity = request.POST.get('quantity', False) 
     if quantity: 
      add_to_cart(request, prod, quantity) 
      return HttpResponseRedirect(reverse("cart")) 
     #if no quantity indicated, display error message 
     return HttpResponseRedirect(reverse('products.views.info', kwargs={'prod': prod, 'error':True})) 

def info(request, prod, error=False): 
    prod = Product.objects.get(id=prod) 
    return render(request, "products/info.html", dict(product = prod, error=error)) 

urls.py:

url(r'^(?P<prod>\d+)/', "products.views.info", name='info'), 

我不斷收到以下錯誤:

Reverse for 'products.views.info' with arguments '()' and keyword arguments '{'prod': u'2', 'error': True}' not found. 1 pattern(s) tried: ['products/(?P<prod>\\d+)/'] 
+0

你確定你的網址不重複?匹配錯誤顯示的模式與您的'urls.py'代碼段顯示的模式不同。 –

+1

@BurhanKhalid:Django允許在部分URL下包含url模式;這個模式被包含在「products /」下。 –

+0

[Django使用reverse()重定向到依賴查詢字符串的URL的重定向](http://stackoverflow.com/questions/4477090/django-redirect-using-reverse-to-a-url-that-relies在一個查詢字符串) –

回答

1

你可以通過可選的GET參數爲:

reverse('products.views.info', kwargs={'prod': prod})+'?error=true&some_other_var=abc' 

reverse以字符串形式返回已解析的URL,因此您可以根據需要連接儘可能多的GET參數。

+0

對於任何使用它的人,這裏有一些代碼 - 'return HttpResponseRedirect('%s?%s'%(reverse('url-name',args =(args_in_url_pattern,)),'&'。join(['%s =%s'%(key,value)for key,request.GET.items()])))'' - 應該可能另外被url轉義? – Chris

2

可選組嘗試在網址:

# change (?P<error>\d+) to (?P<error>[a-zA-Z]+) to catch strings in error value 
url(r'^(?P<prod>\d+)(?:/(?P<error>\d+))?/', "products.views.info", name='info'), 

來源:Making a Regex Django URL Token Optional

0

向視圖函數添加一個參數並不會使它成爲一個URL模式,在你的情況下,你已經將參數直接添加到視圖方法,但沒有將其映射到URL。

因此,當您嘗試反轉URL時,找不到error的模式,這就是您遇到錯誤的原因。

你有兩個選擇:

  1. 充分利用pattern optional我不推薦。

  2. 地圖相同的觀點到多個網址,以及可選的一個第一的圖案中發現的順序匹配:

    url(r'^(?P<prod>\d+)/(?P<error>\d+)/', "products.views.info", name='info-error'), 
    url(r'^(?P<prod>\d+)/', "products.views.info", name='info'), 
    

現在,您的看法:

from django.shortcuts import redirect 

def cartForm(request, prod): 
    if request.method=="POST": 
     quantity = request.POST.get('quantity', False) 
     if quantity: 
      add_to_cart(request, prod, quantity) 
      return HttpResponseRedirect(reverse("cart")) 
     #if no quantity indicated, display error message 
     return redirect('info-error', prod=foo, error=True) 

這裏我使用的是redirect shortcut