【问题标题】:Django- TypeError using URL with multiple argsDjango- TypeError 使用带有多个参数的 URL
【发布时间】:2017-11-14 14:20:53
【问题描述】:

我在使用 Django URL-View 系统时遇到问题。我一直在尝试一个视图:

#views.py...
def IsolatedForm(request, lat, lng, slug):
    if not request.user.is_authenticated():
        return redirect('login')
    chosen_form = Form.objects.filter(slug=slug)
    return render(request, 'polls/isolatedform.html', {'chosen_form':chosen_form, 'lng': lng, 'lat': lat})

我已将它与一个 URL 模式相关联,该模式需要几个浮点数(坐标值)和一个 slug:

#urls.py...
url(r'^testing/(-?\d+\.\d+),(-?\d+\.\d+)/(?P<slug>.*)/$', views.IsolatedForm, name='isolatedform'),

当我尝试使用此 URL 模式时,例如(应用名称为 polls):

polls/testing/1.0,-1.0/postchaos/

(其中“postchaos”是对应于现有表单的示例 slug)我得到:

TypeError at /polls/testing/1.0,-1.0/postchaos/IsolatedForm() 需要 正好 4 个参数(给定 2 个)

我无法意识到实际问题是什么,因为我尝试过的 URL 包含预期的数字和预期的 slug。 任何帮助将不胜感激。

【问题讨论】:

  • 您在视图中使用 lat lng 作为参数,但您没有从 url 传递 lat lng

标签: python regex django django-views django-urls


【解决方案1】:

同时,我在 Stack Overflow 上找到了其他几个答案,它们可以解决问题,同时还将 lat/lng 参数限制为用逗号分隔的浮点数:

为类浮点参数命名:https://stackoverflow.com/a/1128740/6857994

还有一个更好的正则表达式:https://stackoverflow.com/a/15080420/6857994

这是有效的模式:

url(r'^testing/(?P<lat>[+-]?(\d*\.)?\d+),(?P<lng>[+-]?(\d*\.)?\d+)/(?P<slug>[\w-]+)/$', views.IsolatedForm, name='isolatedform'),

此外,尽管 @jgmh 的回答没有解决我不遵守约束的问题,但有关命名值的提示很有帮助。谢谢

编辑:RegEx 更改以允许签名浮点数

【讨论】:

    【解决方案2】:

    您必须为变量命名。 URL 无法理解“lat”和“lng”变量,因此无法将它们传递给视图。 尝试纠正它们,例如:

    url(r'^testing/(?P<lat>\w+)/(?P<lng>\w+)/(?P<slug>.*)/$', views.IsolatedForm, name='isolatedform'),
    

    请记住,所有捕获的参数始终是字符串,您应该在视图中验证它们。

    【讨论】:

    • 这并不能解决问题。而且我不确定是否必须这样命名变量。在另一个具有类似但没有 slug 的更简单 URL 的视图中,我可以将坐标作为参数很好地获取。
    • 您是否将逗号 (",") 更改为斜线 ("/")?
    • 我最终找到了一种不需要斜杠的方法来解决我的问题,或者只允许每个参数都是一个字符串,就像你写的那个 URL 模式一样。不过,我要对您投赞成票,因为您的“命名变量”提示有所帮助,并且实际上是该问题的核心。谢谢
    猜你喜欢
    • 2020-08-14
    • 1970-01-01
    • 2018-06-07
    • 2018-02-21
    • 2018-03-01
    • 1970-01-01
    • 2016-09-10
    • 2019-03-11
    • 2021-10-29
    相关资源
    最近更新 更多