【问题标题】:Passing Query params in Django Class Based View在基于 Django 类的视图中传递查询参数
【发布时间】:2019-12-30 20:06:40
【问题描述】:

我正在尝试形成这样的网址, http://localhost:8000/mealplan/meals/search/2?from_date=2019-12-29&to_date=2019-12-30&from_time=06:00&to_time=22:00

这是我在 urls.py 中尝试过的

    url(r'^meals/search/(?P<user_id>[\w.-]+)/(?P<from_time>[\w.-]+)/(?P<to_time>[\w.-]+)/(?P<from_date>[\w.-]+)/(?P<to_date>[\w.-]+)$', FilterMealList.as_view(), name='filter_meals'),

显然这不起作用。我收到了 404,邮递员上不存在 url。 这也是我基于班级的观点。

class FilterMealList(views.APIView):
    def get(self, request, **kwargs):
        try:
            from_time, to_time, from_date, to_date = kwargs.get('from_time'), kwargs.get('to_time'), kwargs.get(
                'from_date'), kwargs.get('to_date')
            return Response({"Suceess": "{}, {}, {}, {}".format(from_time, to_time, from_date, to_date)},
                            status=status.HTTP_200_OK)
        except KeyError as e:
            return Response({"Failure": "Incomplete query params"}, status=status.HTTP_400_BAD_REQUEST)

所以我的问题, 1. 如何在 django 中定义一个 url 来获取查询参数? 2. 如何在基于类的视图中捕获参数?

如何在 django 中创建一个 url 来获取查询参数

【问题讨论】:

    标签: python django


    【解决方案1】:

    使用request.GET 获取查询参数的字典。参数不应在urls.py 中定义。

    请参阅文档:https://docs.djangoproject.com/en/3.0/ref/request-response/#django.http.HttpRequest.GET

    【讨论】:

    • 那么我的url应该是什么结构呢?
    • 类似这样的东西:url(r'^meals/search/(?P&lt;user_id&gt;[\w.-]+)$', FilterMealList.as_view(), name='filter_meals'))
    • 它应该不需要对查询参数进行任何引用。
    【解决方案2】:

    问号之后的部分称为查询字符串。它在self.request.GET 中作为类字典对象(QueryDict)进行处理和使用。

    你因此定义为路径

    url(r'^meals/search/<b>(?P&lt;user_id&gt;\d+)</b>, FilterMealList.as_view()),

    在您看来,您可以使用以下方法进行过滤:

    class FilterMealList(views.APIView):
    
        def get(self, request, **kwargs):
            user_id = self.kwargs['user_id']
            from_time = self.request.GET.get('from_time')
            to_time = self.request.GET.get('to_time')
            from_date = self.request.GET.get('from_date')
            to_date = self.request.GET.get('to_date')
            # …

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-14
      • 2023-03-23
      • 1970-01-01
      • 2019-03-14
      • 2015-11-04
      • 2015-04-30
      • 2019-04-23
      • 2018-06-26
      相关资源
      最近更新 更多