【问题标题】:Django - Generic FormView - Passing inputs, into templateDjango - 通用 FormView - 将输入传递到模板中
【发布时间】:2020-03-28 03:15:53
【问题描述】:

使用 Django==2.1.7 和 python3.7 - 我在使用 FormView 时真的很吃力 - 请参阅下面的脚本。

如何将通过表单提交的变量search_string 和通过get_context_data 添加的context["new_context_entry"] 中的值传递到success_url,以便可以在提交表单时在我的模板中呈现这些值?

class ConfigSearchTest(FormView):
    template_name = 'archiver_app/config_view.html'
    form_class = forms.DeviceSearchForm
    success_url = 'archiver/search_results/'



    def form_valid(self,form):
        search_string = form.cleaned_data['search_string']
        return super(ConfigSearchTest,self).form_valid(form)

    def get_context_data(self, **kwargs):          
        context = super().get_context_data(**kwargs)                     
        new_context_entry = "adding additional"
        context["new_context_entry"] = new_context_entry
        return context

【问题讨论】:

  • 稍后我可以提供一个更完整的示例,但如果您将搜索字符串作为成员变量,如下所示:self.search_string = ....,那么您可以将get_success_url() 覆盖为return success_url + '?search_string=' + self.search_string
  • @fiddlestix 谢谢 - 如果你能提供一个更完整的例子,不胜感激。

标签: python django django-forms django-views


【解决方案1】:

您已经完成了向模板传递某些内容的工作,您不需要将其放入 URL 中。

my_template.html

{{ new_context_entry }}  # should render as 'adding additional'

如果您愿意,还可以将 URL 查询参数传递给模板。在继续myurl.com?q=testingtesting 之前,通过在浏览器的 URL 栏中输入来测试它。像这样的东西应该可以工作(可能有一些拼写错误,因为 repl.it 正在播放):

my_views.py

class ConfigSearchTest(FormView):
    template_name = 'archiver_app/config_view.html'
    form_class = forms.DeviceSearchForm
    success_url = 'archiver/search_results/'

    def get_context_data(self, **kwargs):          
        context = super().get_context_data(**kwargs)                     
        new_context_entry = "adding additional"
        context["new_context_entry"] = new_context_entry
        context["query_params"] = self.request.GET.get("q", "a default") # should be testingtesting
        return context

my_template.html

{{ new_context_entry }}  # should render as 'adding additional'
{{ query_params }}  # should render as 'testingtesting'

如果您想在表单上单击提交时将?q=testingtesting 添加到 URL,您可以在 get_success_url 中做一些魔术:

my_views.py

class ConfigSearchTest(FormView):
    template_name = 'archiver_app/config_view.html'
    form_class = forms.DeviceSearchForm
    success_url = 'archiver/search_results/'

    def get_success_url(self):          
        # called automatically after form_valid()
        return self.success_url + '?q=' + self.query_string 

    def form_valid(self, form):
        # called when the form is submitted
        self.query_string = form.cleaned_data['query_string']
        return super(SearchFormView, self).form_valid(form)

    def get_context_data(self, **kwargs):   
        # called whenever the pages is rendered       
        context = super().get_context_data(**kwargs)                     
        new_context_entry = "adding additional"
        context["new_context_entry"] = new_context_entry
        context["query_params"] = self.request.GET.get("q", "a default") # should be testingtesting
        return context

【讨论】:

    猜你喜欢
    • 2017-05-30
    • 2012-10-11
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 2013-09-15
    相关资源
    最近更新 更多