【问题标题】:Django: Class Based View accessing URL variablesDjango:基于类的视图访问 URL 变量
【发布时间】:2018-02-20 10:16:45
【问题描述】:

我的 urls.py 有一个条目:

urlpatterns = [

    url(r'^results/(?P<query>).+', views.ResultsView.as_view(), name="results"),
]

与相应的基于类的视图相匹配:

class ResultsView(TemplateView):

    template_name = os.path.join(APPNAME, "results.html")

    def dispatch(self, request, *args, **kwargs):
        query = kwargs['query']
        print("HERE: " + str(json.dumps(kwargs, indent=1)))
        print(self.kwargs['query'])
        print(self.kwargs.get('query'))
        print(kwargs['query'])
        print(kwargs.get('query'))

        if query is None:
            return redirect('/')
        return super(ResultsView, self).dispatch(request, *args, **kwargs)

    def get_context_data(self, **kwargs):

        context = super(ResultsView, self).get_context_data(**kwargs)
        print("HERE: " + str(json.dumps(kwargs, indent=1)))
        print(self.kwargs['query'])
        print(self.kwargs.get('query'))
        print(kwargs['query'])
        print(kwargs.get('query'))
        ...

    # This is just here to test if 'query' is set 
    def get(self, request, query):
        print(query)

我正在尝试获取在 urls.py 中设置的 query 变量的值。但是,在尝试了我在其他 SO 帖子上找到的各种解决方案后(正如您从所有打印语句中看到的那样),没有任何效果。

我相当确定我的 urls.py 设置正确,因为请求解析到正确的页面 (results/),但是所有打印 dict 查询条目的尝试都返回一个空字符串,并且 json.dumps(kwargs, indent=1))打印这个:

HERE: {
 "query": ""
}

我做错了什么?

【问题讨论】:

  • 你能显示一个实际的网址吗?就像您正在传递的查询一样
  • 当然,在本地,带有查询的 url 可能如下所示:http://127.0.0.1:8000/results/australia 其中australia 是用户在搜索栏中设置的查询词。
  • 你犯了一个错误,搜索词将附加到 url 而不是像 127.0.0.1:8000/results/?q=australia 这样的那个。所以你不需要那个参数部分,在视图中,做 request.GET.get('q') 你会得到搜索词,不要忘记从 url 中删除参数
  • 看起来你错过了 url 中的模式部分。尝试将其更改为:url(r'^results/(?P&lt;query&gt;[\w.-]+)', views.ResultsView.as_view(), name="results"),
  • 感谢@neverwalkaloner。这看起来对我有用。我的正则表达式有点生疏,所以我一定误解了我的匹配项。如果您想将其写为答案,我将其标记为正确。

标签: python django url django-class-based-views


【解决方案1】:

只需复制我的评论作为答案。您错过了 url 正则表达式中的模式部分。尝试将 url 更改为:

url(r'^results/(?P<query>[\w.-]+)', views.ResultsView.as_view(), name="results")

【讨论】:

    猜你喜欢
    • 2013-09-23
    • 2013-03-08
    • 2012-02-14
    • 2015-05-08
    • 2011-09-09
    • 2012-12-28
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多