具有非Ascii参数的Django {%url%}

时间:2015-10-06 11:14:02

标签: python django url

我正在使用自定义 templatetag

@register.inclusion_tag('parts/sidebar.html', takes_context = True)
def show_sidebar(context):

    districts = models.Apartment.objects.order_by().values_list('district', flat=True).distinct()
    return {
        'districts': districts
        }

sidebar.html 中,它获取区域并通过{%url%}标记传递它们,并将区域参数传递给views.district

sidebar.html

{% load aptAPI_tags %}
<ul>
  {% for district in districts %}
  <li>
       <a href="{% url 'district' district %}">
        {{ district }}
      </a>

  </li>
  {% endfor %}
</ul>

views.py

def district(request, district):
try:
    apartments = Apartment.objects.filter(district=district).all()
except Apartment.DoesNotExist:
    raise Http404("District does not exist")
return render(request, 'district.html', {'apartments': apartments})

urls.py

url(r'^dist=(?P<district>[0-9A-Za-z._%+-]+)', views.district, name='district'),

它对于地区的“Eixample”运作得很好,但它不适用于非Ascii字符为“Horta-Guinardó”或“Sant Andreu”的区域,因为字符串在第一个非Ascii字符上分裂,我需要它们稍后过滤数据库。 请问有什么想法?有帮助吗? 谢谢

1 个答案:

答案 0 :(得分:1)

您的正则表达式[0-9A-Za-z._%+-]+与非ascii字符不匹配。您必须使用\w。 URL调度程序将为已编译的正则表达式设置re.UNICODE标志,这将匹配任何字母数字的unicode字符。

您还希望将$添加到正则表达式的末尾以匹配行尾。

url(r'^dist=(?P<district>[\w\.%+-]+)/$', views.district, name='district'),