【问题标题】:class based templateview context is not rendering基于类的模板视图上下文未呈现
【发布时间】: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 的方法。出于这个原因,在基于泛型类的视图上覆盖 getpost 通常是个坏主意——它很容易破坏这样的功能,或者您最终不得不复制代码。
  • 无论如何,我看不出您为什么要费心将数据放入会话中。您的get_context_data 方法可以直接从self.request.GET 访问它。会话用于在视图之间传递数据,而不是在同一视图中的不同方法之间传递数据。
  • Thanks@Alasdair 我认为不是覆盖 get 方法,而是将一个表单类添加到前一个类中。这样它就会进入搜索表单。并且当 html 操作将其推送到新的 url 时,在新的模板视图中检索 get 参数。我试图这样做是因为我的 homeview 应该是干净的,没有表格,我想保持这种状态。
  • @Daniel Roseman,我明白你的意思,所以在方法之间传递数据,我不应该使用会话,我应该使用 self.function。

标签: django django-class-based-views


【解决方案1】:

不要使用 context["form"] = SearchForm() 来呈现表单,而是在第一个模板视图中包含一个表单类来为用户呈现表单。

class HomeView(TemplateView, FormView):
    template_name = "home.html"
    title = 'Your Dashboard'
    form_class = SearchForm

在第二个模板视图上,执行 self.request.GET 以收集 get_context_data 方法中的用户输入。

 class PollSearchView(TemplateView):
    template_name = 'polls/polls_search.html'

    def get_context_data(self, **kwargs):
        context = super(PollSearchView, self).get_context_data(**kwargs)
        print self.request.GET
        return context

这将使 get_context_data 能够获取用户输入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-17
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多