Django-URL中可选的更清洁的GET参数?

问题描述 投票:2回答:1

我正在尝试在模板上设置对象过滤器栏。这由几个<select>下拉列表组成。我计划然后通过重新加载URL并使用GET请求将其发送回我的视图。

所以我的问题分为两部分:

  1. 有没有办法使GET参数对于Django是可选的?例如,我可以使用mysite.com为我提供默认视图,也可以使用mysite.com/name/age以按名称和年龄参数进行过滤吗?

  2. 根据上述示例。假设我想按5个或6个参数进行过滤,或者可能会错过一些参数。我该怎么做,这样我就没有像mysite.come / name / age / occupation / birthday / bankbalance这样的庞大URL?

编辑:为进一步澄清,我想知道是否也可以使这些参数乱序,所以它不一定总是在年龄之前是名字,等等。所以我可以将年龄/职业/名字用于例如。

django django-models django-rest-framework get django-urls
1个回答
1
投票

正如Daniel在评论中已经提到的那样,您似乎使Django的url参数和HTTP“ GET”参数混淆。

第一个是Django网址格式定义(您的urls.py文件)中的“动态”部分,实际上是从网址的“路径”部分(“ / path / to / someresource”部分)提取的。这是Django内部的东西。

秒是HTTP规范的一部分,是“?”之后的部分在url中,即“ / path / to / someresource?foo = bar&baaz = quux”中,GET参数为“ foo = bar”和“ baaz = quux”。 Django的网址格式(仅适用于“路径”部分)不使用此部分(称为“查询字符串”)。从request.GET的视图中可以访问它,然后由视图来执行某些操作或完全忽略它。

从语义POV,对于列表视图中的过滤器,您需要HTTP GET参数,而不是url参数(您仍在访问相同的资源,而不是其他资源)。从实际的POV来看,您还需要HTTP GET参数,因为它比尝试使用urlpatterns要容易得多:

def myview(request):
    queryset = MyModel.objects.all()
    param1 = request.GET.get("param1", None)
    if param1:
        queryset = queryset.filter(somefield=param1)
    param2 = request.GET.get("param2", None)
    if param2:
        queryset = queryset.filter(otherfield=param2)
    # etc
    return render(request, "mytemplate.html", {"objects": queryset})
© www.soinside.com 2019 - 2024. All rights reserved.