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

Django - Optional cleaner GET parameters in URL?

我正在尝试在我的模板上设置一个对象过滤栏。这包括几个 <select> 下拉菜单。我计划然后通过重新加载 URL 但使用 GET 请求将它们发送回我的视图。

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

  1. 有没有办法让 Django 的 GET 参数可选?例如,我可以有 mysite.com 给我默认视图,还有 mysite.com/name/age 按姓名和年龄参数过滤吗?

  2. 按照上面的例子。假设我想按 5 或 6 个参数进行过滤,或者可能漏掉一些。我该怎么做才能避免像 mysite.come/name/age/occupation/birthday/bankbalance?

  3. 这样的巨人 URL

编辑:为了进一步说明,我想知道我是否也可以乱序设置这些参数,这样它就不必总是在年龄之前是名字,等等。所以我可以 age/occupation/name 例如。

正如 Daniel 在评论中提到的,您似乎混淆了 Django 的 url 参数和 HTTP "GET" 参数。

首先是 Django url 模式定义(您的 urls.py 文件)中的 "dynamic" 部分,实际上是从 "path" 部分提取的 url(“/path/to/someresource”部分)。这是 Django 内部的东西。

秒数是 HTTP 规范的一部分,是“?”之后的部分。在 url 中,即在“/path/to/someresource?foo=bar&baaz=quux”中,GET 参数是 "foo=bar" 和 "baaz=quux"。这部分 - 名为 "query string" - 不被 Django 的 url 模式使用(仅适用于 "path" 部分)。它可以在 request.GET 的视图中访问,然后由视图对其进行处理或完全忽略它。

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

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})

您可以将它作为查询参数添加到请求中,这样您的 url 看起来像

path('api/your-url', YourView.as_view(), name='your-view')

您的视图文件看起来像

def get(self, request, *args, **kwargs):
    pass

def post(self, request, *args, **kwargs):
    pass

def put(self, request, *args, **kwargs):
    pass

def delete(self, request, *args, **kwargs):
    params = request.GET.get('exampleParam')
    #do something with params

所有视图都将起作用,删除将根据 url 中的内容删除,例如,如果 url 是

domain.com/api/url?exampleParam=1

您的删除视图现在可以获取它而无需添加新视图