正则表达式[\w-.']+
(在http://regexr.com/中测试过)似乎与我的需求正确匹配。我需要能够在网址中匹配“don't
”,“e.g.
”,“air-condition
”等英文字词。我还需要支持下划线,因为我用它替换单词中的空格(例如,“气球”在URL中变为“air_balloon
”。所以我在Django中尝试了网址配置r"^(?P<word>[\w-.']+)/$"
,但它给了我一个错误:ImproperlyConfigured ... is not a valid regular expression
。
如果我稍微更改一下并使用配置r"^(?P<word>[\w\-.\']+)/$"
,那么我就不会收到错误,而“dog
”,“e.g.
”等字词会正常工作。但是在“don't
”的情况下,我得到一个错误:NoReverseMatch at / application / not /:反向“view”,参数'('n#39; t')'找不到。单词“n't
”作为参数在结果中是预期的,但它不应该给我一个错误。我想我可以使用safe
和/或safeseq
模板过滤器来解决这个问题,但没有成功。
如何在Django中配置我的URL以正确匹配URL中的撇号?还有什么我需要考虑以安全和最佳的Django方式实现它吗?此外,我想了解为什么Django给我一个正则表达式的错误,它正好与regexr.com中的预期一样。
错误消息中显示的模式如下所示:application/(?P<word>[\\w\\-.\\']+)/$
。视图非常复杂,但这里是简化版本,希望其中包含所有相关部分:
def search(request, word):
if request.method == 'POST':
search_form = SearchForm(data=request.POST)
if search_form.is_valid():
word = search_form.cleaned_data['word'].replace(' ', '_')
return HttpResponseRedirect(reverse('search', kwargs={'word': word}))
else:
raise SuspiciousOperation
elif request.method == 'GET':
results = _search(word)
return render(request, 'application/result_list.html', results)
_search()
内发生的事情不再与网址相关。
我认为我可能在模板渲染中得到错误,因为模板呈现了相关单词的列表。它以下列方式完成:
{% for word in results.words %}
<a href="{% url 'search' word.split|join:'_' %}">{{ word }}</a>
{% endfor %}