2009-07-14 11 views
5

Chciałbym użyć liczby z kropką dziesiętną w wzorzec adresu URL Django, ale nie jestem pewien, czy jest to rzeczywiście możliwe (nie jestem ekspertem regex).Jak używać liczby dziesiętnej w wzorcu adresu URL Django?

Oto co chcę użyć dla URL:

/item/value/0.01 
/item/value/0.05 

te adresy URL pokaże przedmioty o wartości $ 0,01 lub $ 0,05. Pewnie, mógłbym wziąć łatwą drogę i przekazać wartość w centach tak, aby był/item/value/1, ale chciałbym otrzymać argument w moim widoku jako typ danych dziesiętnych zamiast jako liczbę całkowitą (i Być może będę musiał poradzić sobie z ułamkami centa w pewnym momencie). Czy jest możliwe napisanie wyrażenia regularnego w wzorzec adresu URL Django, który poradzi sobie z tym?

Odpowiedz

13

To może być coś podobnego

urlpatterns = patterns('', 
    (r'^item/value/(?P<value>\d+\.\d{2})/$', 'myapp.views.byvalue'), 
    ... more urls 
) 

adres URL nie powinien zaczynać się ukośnikiem.

w widokach można mieć funkcję:

def byvalue(request,value='0.99'): 
    try: 
     value = float(value) 
    except: 
     ... 
+0

Proszę nie używać gołego 'except:', ponieważ będzie to jeść każdy pojedynczy błąd, często ukrywając błędy. Prawdopodobnie chcesz po prostu złapać 'ValueError'' (z wyjątkiem ValueError:') –

13

nie wiem o Django specjalnie, ale to powinien być zgodny z adresem URL:

r"^/item/value/(\d+\.\d+)$" 
+6

Jeśli chcesz mieć ints i floats w * jednym * url, napisz coś takiego: 'r" ^/item/value/(\ d + (?: \. \ d +)) $ "' – Boldewyn

+0

+1 dla bardziej ogólnej odpowiedzi (nie ograniczonej do liczby z dwiema cyframi po przecinku) – btk

+0

@Boldewyn Ur rozwiązanie nie działa. Ani dla ints, ani dla floats ... próbowałem go użyć, ale bez skutku. –

3

Jeżeli wartości mają być akceptowane są tylko $ 0,01 lub $ 0,05, wzór na harto może być określona następująco:

r"^/item/value/(\d\.\d{2})$" 
+0

Dziękuję, każdy post dodał mały fragment układanki. Jewgienij miał magiczną kulę. –

Powiązane problemy