包含几个可选参数/参数的 django url
Posted
技术标签:
【中文标题】包含几个可选参数/参数的 django url【英文标题】:A django url that contains several optional arguments / parameters 【发布时间】:2020-08-23 20:22:50 【问题描述】:在尝试构建我的第一个 django 项目时,我被困在传递值以进行产品过滤。每个传递给它的值为 1 的特征将是一个活动过滤器,而其他的将是 0,即不活动。 urls.py:
urlpatterns=[
path('women/<str:category>/filter?pricefrom=<int:min>&to=<int:max>&size?s=<int:s>&m=<int:m>&l=<int:l>&xl=<int:xl>&xxl=<int:xxl>&xxxl=<int:xxxl>&color?blue=<int:blue>&red=<int:red>&yellow=<int:yellow>&black=<int:black>&white=<int:white>&green=<int:green>&brown=<int:brown>',views.women_category,name='women category page with filters'),
]
views.py:
def women_category(request,category,id=None,flag=None,min=None,max=None,s=None,m=None,l=None,xl=None,xxl=None,xxxl=None,blue=None,red=None,yellow=None,black=None,white=None,green=None,brown=None):
#product filter logics here
我希望用户应该能够使用任何可能的过滤器组合,过滤器是: 价格:最低,最高 尺码: S,M,L,XL,XXL,XXXL 颜色:黄色,蓝色,绿色,...等
我不知道如何在 urls 中使用 Regex,所以请帮我将我的 url 转换为 regex url,以便所有过滤器变量都是可选的,可以通过前端传递。
【问题讨论】:
【参考方案1】:有几种方法可以添加可选参数您可以使用正则表达式或添加多个模式。您可以在此处查看示例:Optional get parameters in django?
但在您使用 get 参数进行过滤的情况下,更好的选择是在视图上处理它。因为你有很多参数,所以它需要很多重复的模式,这些模式差异很小,如果你使用正则表达式,这将是一个很长的正则表达式,或者如果你使用一个简单的正则表达式,你必须对你的视图进行验证。因此,只需获取视图中的值并在那里进行过滤:
def women_category(request,category):
min_value = request.GET.get("min")
max_value = request.GET.get("max")
flag = request.GET.get("flag")
...
您可以随时添加或删除任何参数,而不会弄乱您的 URL 路径文件。
【讨论】:
我可以通过将所有参数作为表单输入传递来使用 GET 方法。但问题是,如果我在任何 html 页面中保留一个表单,每当用户尝试刷新产品页面时,都会在浏览器中弹出一个“确认表单重新提交”弹出窗口,而我在女性中不需要衣服目录,不是吗? 我不知道表单与此有什么关系。但是request.GET
基本上是您的 URL 参数,在您的视图中获取这些参数或添加 URL 或正则表达式之间没有区别。结果将完全相同。【参考方案2】:
您不需要也不应该将查询参数作为 URL 的一部分进行匹配。这些可以通过 request.GET 在 Django 中获得。
旁注:如果可能,我认为建议使用
urls.py:
urlpatterns = [
path('women/<slug:category>/filter',views.women_category,name='women category page with filters'),
]
views.py:
def women_category(request,category):
id = request.GET.get('id') # ... etc
# product filter logics here
【讨论】:
以上是关于包含几个可选参数/参数的 django url的主要内容,如果未能解决你的问题,请参考以下文章