9 Stimmen

Wie verwende ich eine Dezimalzahl in einem Django URL-Muster?

Ich möchte eine Zahl mit einem Dezimalpunkt in einem Django URL-Muster verwenden, aber ich bin nicht sicher, ob es tatsächlich möglich ist (ich bin kein Regex-Experte).

Das ist es, was ich für URLs verwenden möchte:

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

Diese URLs würden Artikel im Wert von $0,01 oder $0,05 anzeigen. Natürlich könnte ich den einfachen Weg gehen und den Wert in Cent übergeben, so dass es /item/value/1 wäre, aber ich möchte das Argument in meiner Ansicht als dezimalen Datentyp und nicht als Ganzzahl empfangen (und ich muss möglicherweise mit Bruchteilen eines Cents an einem gewissen Punkt umgehen). Ist es möglich, eine Regex in einem Django-URL-Muster zu schreiben, die dies behandeln wird?

18voto

Evgeny Punkte 10456

Es kann etwas sein wie

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

url sollte nicht mit einem Schrägstrich beginnen.

in Ansichten können Sie Funktion haben:

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

14voto

harto Punkte 87633

Ich weiß nicht, wie es bei Django ist, aber das sollte mit der URL übereinstimmen:

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

3voto

TonyCool Punkte 1004

Wenn die zu akzeptierenden Werte nur $0,01 oder $0,05 sind, kann das Harto-Muster wie folgt angegeben werden:

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

1voto

hygull Punkte 7822

Verwenden Sie nicht "

url(r"^item/value/(?P<dollar>\d+\.\d{1,2})$", views.show_item, name="show-item"),

Es wird nur mit dem URL-Muster wie /item/value/0.01 , /item/value/12.2 usw.

Es wird nicht übereinstimmen URL-Muster wie /item/value/1.223 , /item/value/1.2679 usw.

Besser ist die Verwendung von "

url(r"^item/value/(?P<dollar>\d+\.\d+)$", views.show_item, name="show-item"),

Es wird übereinstimmen mit URL-Muster wie /item/value/0.01 , /item/value/1.22 , /item/value/10.223 , /item/value/1.3 usw.

Endlich können Sie Ihre views.py etwas wie

Dies ist nur ein Beispiel.

# Make sure you have defined Item model (this is just an example)
# You use your own model name
from .models import Item 

def show_item(request, dollar):
    try:
        # Convert dollar(string) to dollar(float).
        # Which gets passed to show_item() if someone requests 
        # URL patterns like /item/value/0.01, /item/value/1.22 etc.
        dollar = float(dollar);

        # Fetch item from Database using its dollar value
        # You may use your own strategy (it's mine)
        item = Item.objects.get(dollar=dollar);

        # Make sure you have show_item.html.
        # Pass item to show_item.html (Django pawered page) so that it could be 
        # easily rendered using DTL (Django template language).
        return render(request, "show_item.html", {"item": item});
    except:
        # Make sure you have error.html page (In case if there's an error)
        return render(request, "error.html", {});

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X