【发布时间】:2018-03-25 17:47:41
【问题描述】:
我有一个模板视图,它应该接受用户提交的搜索。我打算使用 get 方法在 get_context_data 中进行查询,以便在 HTML 上显示一些结果。不幸的是,我的 get_context_data 不起作用,而我的模板视图中的 get 方法和调度工作正常。当用户提交搜索时,get_context_data 根本不会运行。
class PollSearchView(TemplateView):
template_name = 'polls/polls_search.html'
def get(self, request, **kwargs):
self.request.session["search"] = request.GET.get("search")
return render(request, 'polls/polls_search.html')
def dispatch(self, *args, **kwargs):
dispatch = super(PollSearchView, self).dispatch(*args, **kwargs)
#exit if no search
if self.request.GET.get("search") == None:
pass
return redirect('/')
return dispatch
def get_context_data(self, **kwargs):
context = super(PollSearchView, self).get_context_data(**kwargs)
search = self.request.session.get("search")
context["test"] = search
return context
我有另一个类基于用户通过表单的输入重定向到上面的类。
class HomeView(TemplateView):
template_name = "home.html"
def get_context_data(self, *args, **kwargs):
context = super(HomeView, self).get_context_data(*args, **kwargs)
context["form"] = SearchForm()
return context
我认为表单工作得很好,为什么 get_context_data 不包含任何信息让我感到困惑,我根据 get 的结果寻找其他方法来呈现上下文。任何关于为什么这不起作用以及如何去做的指导都会很棒。
谢谢大家
【问题讨论】:
-
TemplateView.get方法通常会调用get_context_data,但您已将其替换为直接调用render的方法。出于这个原因,在基于泛型类的视图上覆盖get和post通常是个坏主意——它很容易破坏这样的功能,或者您最终不得不复制代码。 -
无论如何,我看不出您为什么要费心将数据放入会话中。您的
get_context_data方法可以直接从self.request.GET访问它。会话用于在视图之间传递数据,而不是在同一视图中的不同方法之间传递数据。 -
Thanks@Alasdair 我认为不是覆盖 get 方法,而是将一个表单类添加到前一个类中。这样它就会进入搜索表单。并且当 html 操作将其推送到新的 url 时,在新的模板视图中检索 get 参数。我试图这样做是因为我的 homeview 应该是干净的,没有表格,我想保持这种状态。
-
@Daniel Roseman,我明白你的意思,所以在方法之间传递数据,我不应该使用会话,我应该使用 self.function。
标签: django django-class-based-views