我正在尝试在模板上设置对象过滤器栏。这由几个<select>
下拉列表组成。我计划然后通过重新加载URL并使用GET请求将其发送回我的视图。
所以我的问题分为两部分:
有没有办法使GET参数对于Django是可选的?例如,我可以使用mysite.com为我提供默认视图,也可以使用mysite.com/name/age以按名称和年龄参数进行过滤吗?
根据上述示例。假设我想按5个或6个参数进行过滤,或者可能会错过一些参数。我该怎么做,这样我就没有像mysite.come / name / age / occupation / birthday / bankbalance这样的庞大URL?
编辑:为进一步澄清,我想知道是否也可以使这些参数乱序,所以它不一定总是在年龄之前是名字,等等。所以我可以将年龄/职业/名字用于例如。
正如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})