0

升级后,我试图在 Django 中更改为基于类的视图,对此我有两个问题。这是我的代码,简化:

# urls.py

urlpatterns += patterns('project.app.views',
    ('^$', 'index'), # Old style
    url(r'^test/$', SearchView.as_view()), # New style
)


# views.py

class SearchView(TemplateView):
    template_name = 'search.html'

    def get_context_data(self, **kwargs):
        messages.success(request, 'test')
        return {'search_string': 'Test'}

当我运行它时,我首先得到错误name 'SearchView' is not defined。有谁知道为什么?

试图跳过我添加from project.app.views import SearchView的丑陋而不是我希望它工作的方式,但是嘿,我试着看看我是否能让其余的工作。然后我global name 'request' is not defined因为messages. 这是有道理的,但我如何在这里获取请求对象?

所以我想知道:如何让视图按预期工作以及如何使用消息get_context_data()

4

2 回答 2

1

你看到name 'SearchView' is not defined是因为你没有导入SearchView到你的urls.py. 如果您认为这很难看,那么您可以search = SearchView.as_view()使用views.py旧样式来引用视图search。可以访问该请求self.request以添加消息。下面给出了更新的源示例。

# views.py
class SearchView(TemplateView):
    template_name = 'search.html'

    def get_context_data(self, **kwargs):
        messages.success(self.request, 'test')
        return {'search_string': 'Test'}

search = SearchView.as_view()

# urls.py
urlpatterns += patterns('project.app.views',
    url('^$', 'index'), # Old style
    url(r'^test/$', 'search'), # New style
)
于 2012-04-19T13:45:42.857 回答
0

请一次问一个问题(StackOverflow 指南)。

反正:

  • 这就是基于类的视图的工作方式。没有自动导入魔法,您只需导入类并使用它的 as_view() 方法。
  • 您可以通过 访问视图类中的请求对象self.request
于 2012-04-19T13:43:25.523 回答