Как использовать десятичное число в шаблоне URL Django? - PullRequest
8 голосов
/ 15 июля 2009

Я хотел бы использовать число с десятичной точкой в ​​шаблоне URL Django, но я не уверен, возможно ли это на самом деле (я не эксперт по регулярным выражениям).

Вот что я хочу использовать для URL:

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

В этих URL-адресах будут отображаться элементы стоимостью $ 0,01 или $ 0,05. Конечно, я мог бы пойти простым путем и передать значение в центах, чтобы оно было / item / value / 1, но я хотел бы получить аргумент в моем представлении как десятичный тип данных, а не как целое число (и Возможно, мне придется иметь дело с долями цента в какой-то момент). Можно ли написать регулярное выражение в шаблоне URL Django, который будет обрабатывать это?

Ответы [ 4 ]

16 голосов
/ 15 июля 2009

Это может быть что-то вроде

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

URL не должен начинаться с косой черты.

в представлениях вы можете иметь функцию:

def byvalue(request,value='0.99'):
    try:
        value = float(value)
    except:
        ...
14 голосов
/ 15 июля 2009

Я не знаю конкретно о Django, но это должно соответствовать URL:

r"^/item/value/(\d+\.\d+)$"
3 голосов
/ 15 июля 2009

Если допустимые значения составляют всего 0,01 долл. Или 0,05 долл., Шаблон харто может быть указан следующим образом:

r"^/item/value/(\d\.\d{2})$"
0 голосов
/ 06 мая 2018

Не используйте "

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

Он будет соответствовать только шаблонам URL , таким как /item/value/0.01, /item/value/12.2 и т. Д.

Это не будет соответствовать шаблонам URL , таким как /item/value/1.223, /item/value/1.2679 и т. Д.

Лучше использовать "

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

Он будет соответствовать шаблонам URL , таким как /item/value/0.01, /item/value/1.22, /item/value/10.223, /item/value/1.3 и т. Д.

Наконец-то вы можете создать свой views.py что-то вроде

Это только для примера.

# 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", {});
...