【问题标题】:How Do I Use A Decimal Number In A Django URL Pattern?如何在 Django URL 模式中使用十进制数?
【发布时间】:2010-11-10 20:25:42
【问题描述】:

我想在 Django URL 模式中使用带小数点的数字,但我不确定它是否真的可行(我不是正则表达式专家)。

这是我要用于 URL 的内容:

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

这些 URL 将显示价值 0.01 美元或 0.05 美元的商品。当然,我可以采取简单的方法并以美分为单位传递值,因此它将是 /item/value/1,但我希望在我的视图中接收参数作为十进制数据类型而不是整数(并且在某些时候我可能不得不处理一小部分)。是否可以在 Django URL 模式中编写一个正则表达式来处理这个问题?

【问题讨论】:

    标签: python regex django django-urls


    【解决方案1】:

    我不具体了解 Django,但这应该与 URL 匹配:

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

    【讨论】:

    • 如果您想在 one url 中包含整数和浮点数,请编写如下内容:r"^/item/value/(\d+(?:\.\d+))$"
    • +1 以获得更通用的答案(不限于小数点后两位数字)
    • @Boldewyn Ur 解决方案不起作用。既不是整数也不是浮点数......我尝试使用它但无济于事
    • @S.Ali 谢谢。有一个 ? 缺失:r"^/item/value/(\d+(?:\.\d+)?)$" - 但是对于浮点数,它以前应该可以工作。
    【解决方案2】:

    可能是这样的

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

    网址不应以斜杠开头。

    在视图中你可以拥有功能:

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

    【讨论】:

    • 请不要使用裸露的except:,因为这会吞噬每一个错误,通常会隐藏错误。你可能只想赶上ValueError's (except ValueError:)
    【解决方案3】:

    如果要接受的值只有 $0.01 或 $0.05,则可以像这样指定 harto 模式:

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

    【讨论】:

    • 谢谢,每个帖子都增加了一点拼图。 Evgeny 拥有灵丹妙药。
    【解决方案4】:

    不要使用 »

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

    【讨论】:

    • 这个的忠实粉丝。如何让r"^item/value/(?P&lt;dollar&gt;\d+\.\d+)$" 允许负值?
    猜你喜欢
    • 2017-02-26
    • 2021-04-09
    • 2018-05-29
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 2011-09-30
    相关资源
    最近更新 更多