Python django-可选url参数的regex

Python django-可选url参数的regex,python,django,url-pattern,urlconf,Python,Django,Url Pattern,Urlconf,我在django中有一个视图,可以接受许多不同的过滤器参数,但它们都是可选的。若我有6个可选的过滤器,那个么我真的必须为6个过滤器的每一个组合编写url吗?或者是否有办法定义url的哪些部分是可选的 给你一个只有2个过滤器的例子,我可以有所有这些url的可能性: /<city>/<state>/ /<city>/<state>/radius/<miles>/ /<city>/<state>/company/<

我在django中有一个视图,可以接受许多不同的过滤器参数,但它们都是可选的。若我有6个可选的过滤器,那个么我真的必须为6个过滤器的每一个组合编写url吗?或者是否有办法定义url的哪些部分是可选的

给你一个只有2个过滤器的例子,我可以有所有这些url的可能性:

/<city>/<state>/
/<city>/<state>/radius/<miles>/
/<city>/<state>/company/<company-name>/
/<city>/<state>/radius/<miles>/company/<company-name>/
/<city>/<state>/company/<company-name>/radius/<miles>/
///
///半径//
///公司//
///radius/公司//
///公司//半径//
所有这些url都指向同一个视图,唯一需要的参数是city和state。使用6个筛选器,这将变得不可管理


做我想做的事情的最佳方式是什么?

尝试在URL.py中使用类似的内容:

url(r'^(?P<city>[^/]+)/(?P<state>[^/]+)/(radius/(?P<miles>[^/]+)/|company/(?P<company_name>[^/]+)/)*$', 'view')
url(r'^(?P[^/]+)/(?P[^/]+)/(radius/(?P[^/]+)/;company/(?P[^/]+)/)*$,“视图”)

您也可以只创建一个指向视图的url(只检查路径的开头,应该是相同的),然后在视图中解析
请求.path

另一方面,如果在各种组合中有许多可选的过滤器参数,那么最好的解决方案通常是通过
GET
-参数进行过滤,特别是如果用于筛选的URL不需要针对任何搜索引擎进行优化…

一种方法是让正则表达式将所有给定的筛选器作为单个字符串读取,然后在视图中将它们拆分为单个值

我找到了以下网址:

(r'^(?P<city>[^/]+)/(?P<state>[^/]+)(?P<filters>(?:/[^/]+/[^/]+)*)/?$',
 'views.my_view'),
关于这一点,需要注意两件事。首先,它允许未知的过滤器条目进入您的视图。例如,
/fakefilter/somevalue
是有效的。上面的视图代码忽略了这些,但您可能希望向用户报告错误。如果是这样,请修改代码,将值设置为

radius = filters.pop('radius', None)
company = filters.pop('company', None)
过滤器
字典中剩余的任何条目都是未知值,您可以对此进行投诉

第二,如果用户重复筛选,将使用最后一个值。例如,
/radius/80/radius/50
将半径设置为50。如果要检测此情况,需要先扫描值列表,然后再将其转换为字典:

given = set()
for name in split[::2]:
    if name in given:
        # Repeated entry, complain to user or something.
    else:
        given.add(name)

这绝对是GET参数的用例。您的urlconf应该是
/city/state/
,然后各种过滤器作为GET变量出现在末尾:

/city/state/?radius=5&company=google

现在,在您看来,您接受
city
state
作为正常参数,但其他所有内容都存储在
请求中。获取
QueryDict。

Django能够反转该URL吗?这可能与巴巴巴的情况无关……是的,我知道我可能无法使用反转来显示此视图,但这对我的情况没关系。谢谢你的帮助和伟大的回答!唯一一件似乎不能100%工作的事情是,返回的值都有一个冒号“:”在它们的末尾。嗯,我在这里测试时没有注意到这一点。你能举一个URL的例子吗?
/city/state/?radius=5&company=google