如何在Django中为URL参数设置默认值?
在Django中为URL参数定义默认值的方法
针对你的需求,这里提供两种实用的实现方式:
方法一:通过URL配置传递默认参数
修改项目根目录的urls.py,新增一条不带web参数的路径,通过字典传递默认值chemical,同时保留原有的带参数路径:
urlpatterns = [ path('admin/', admin.site.urls), # 匹配不带web参数的/staff路径,传递默认值 path('staff/', include('staff.urls'), {'web': 'chemical'}), # 匹配带web参数的路径 path('<str:web>/staff/', include('staff.urls')), ]
同时修改views.py中的get_queryset方法,避免直接取self.kwargs['web']引发KeyError,改用get方法获取参数(可额外保留默认值做双重保险):
def get_queryset(self): web = self.kwargs.get('web', 'chemical') return Staff.objects.filter(websites__path=web)
方法二:结合正则URL与视图默认值
如果想用单条URL规则匹配两种访问场景(带/不带web参数),可以使用re_path定义可选参数:
修改根urls.py:
from django.urls import re_path urlpatterns = [ path('admin/', admin.site.urls), # 正则匹配可选的web参数,支持两种路径格式 re_path(r'^(?:(?P<web>[^/]+)/)?staff/', include('staff.urls')), ]
然后在视图的get_queryset中直接设置参数默认值即可:
def get_queryset(self): web = self.kwargs.get('web', 'chemical') return Staff.objects.filter(websites__path=web)
注意事项
- 不要直接使用
self.kwargs['web'],否则当没有传递参数时会抛出KeyError异常。 - 使用正则URL时,
(?:...)是非捕获组,?标记该组为可选,确保同时匹配带/不带web的路径。
内容的提问来源于stack exchange,提问作者Darwin
相关产品推荐
相关产品推荐

