Django:如何在URL中匹配撇号

时间:2017-07-22 09:02:17

标签: python regex django url

正则表达式[\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 %}

0 个答案:

没有答案