如何在Django的urls.py中集成正则处理URL参数去除+及后续内容
Django URL参数处理:移除+及后续内容的解决方案
问题说明
你需要处理以下URL:
http://localhost/ville/selectville/name/?&name=Paris+-+75002
最终要得到:
http://localhost/ville/selectville/name/?&name=Paris
已知用正则re.sub(r'\+.*', '', myurl)可以实现字符串处理,但不清楚如何集成到现有的urls.py配置中:
path('selectville/<str:name>/', VilleSelect.as_view(), name='ville_select'),
两种可行解决方案
方案一:用re_path()替代path(),路由层直接过滤参数
Django的path()方法的str转换器会匹配所有非/的字符,无法过滤+及后续内容,改用re_path()(即原url()方法),通过正则表达式直接捕获+之前的内容作为name参数:
from django.urls import re_path from .views import VilleSelect urlpatterns = [ # 正则[^+]+匹配任意非+的字符,自动截断+及后续内容 re_path(r'^selectville/(?P<name>[^+]+)/', VilleSelect.as_view(), name='ville_select'), ]
这样路由捕获的name参数直接就是Paris,无需额外处理。
方案二:在视图中处理参数(保留原路由结构)
如果不想修改路由配置,可以在VilleSelect视图类中对传入的name参数做清洗:
import re from django.views.generic import View class VilleSelect(View): def get(self, request, *args, **kwargs): raw_name = kwargs.get('name', '') # 移除+及之后的所有内容 cleaned_name = re.sub(r'\+.*', '', raw_name) # 后续业务逻辑使用cleaned_name即可 # ...
内容的提问来源于stack exchange,提问作者Zembla
相关产品推荐
相关产品推荐

