2014-01-14 3 views
2

정보 용 Django의 Reverse를 옵션 매개 변수와 함께 사용하려면 어떻게해야합니까?Django HTTPResponseRedirect & Reverse with optional parameter

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'), 

나는 다음과 같은 오류가 계속 : 나는

이 views.py 받고 계속

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

URL은 중복되지 않습니까? 일치 오류는'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) -on-query-strings) –

답변

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 '키의 값 (키, 값), request.GET.items()]))))'- 추가적으로 url이 이스케이프되어야합니까? – Chris

2

는 URL에 옵션 그룹과 시도 :

# 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

view 함수에 인수를 추가해도 URL 패턴이되지는 않지만 view 메소드에 인수 directy를 추가했지만 URL에 매핑하지 않았습니다.

따라서 URL을 바꾸려고하면 error이있는 패턴을 찾을 수 없으므로 오류가 발생합니다.

  1. 내가 추천하지 않는 pattern optional합니다

    당신은 두 가지 옵션이 있습니다.

  2. 패턴이 발견 된 순서대로 일치로 옵션 하나 여러 URL에 동일한보기를,지도 :

    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) 
    
    :보기에,

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

지금

여기를 사용 중입니다. redirect shortcut