【问题标题】:Django - Optional cleaner GET parameters in URL?Django - URL中的可选清洁器GET参数?
【发布时间】:2020-03-26 23:11:21
【问题描述】:

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

所以我的问题有两个部分:

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

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

编辑:为了进一步澄清,我想知道我是否也可以让这些参数乱序,所以它并不总是需要在年龄之前命名,等等。所以我可以有年龄/职业/姓名例如。

【问题讨论】:

  • GET 参数与 URL 参数不同。

标签: django django-models django-rest-framework get django-urls


【解决方案1】:

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

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

秒是 HTTP 规范的一部分,是“?”之后的部分。在 URL 中,即在“/path/to/someresource?foo=bar&baaz=quux”中,GET 参数是“foo=bar”和“baaz=quux”。这部分 - 命名为“查询字符串” - 不被 Django 的 url 模式使用(它只适用于“路径”部分)。它可以在 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})

【讨论】:

  • 感谢您的回答!这真的让我明白了。您能否在回答中澄清此声明:“从实际的 POV 中,您还需要 HTTP GET 参数”?我不确定我明白你的意思
  • @Cm1695 我的意思是,对于您正在尝试做的事情,使用 HTTP GET 参数比尝试将它们嵌入到 url 的路径中并处理它们要容易得多 Django 的 url 模式。当我说“容易得多”时,我说的是数量级(复数),真的。
  • 啊,明白了。是的,现在我明白了这种差异,我明白你的意思了
【解决方案2】:

您可以将其作为查询参数添加到请求中,这样您的网址就会看起来像

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

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

【讨论】:

    猜你喜欢
    • 2012-12-30
    • 1970-01-01
    • 2014-01-08
    • 2018-01-25
    • 1970-01-01
    • 2019-01-15
    • 2020-08-23
    相关资源
    最近更新 更多