为了账号安全,请及时绑定邮箱和手机立即绑定

更新Form.intial不会改变Django模板中的初始值

更新Form.intial不会改变Django模板中的初始值

慕森王 2022-08-25 14:33:52
目标我想在搜索结果呈现时保留查询。下面是一个示例,其中搜索栏在结果页面上包含堆栈溢出。失败的解决方案这些是最小的代码示例# search_results.html<form action="/search" method="post">    {% csrf_token %}    {{ form }}    <input type="submit" value="Search"></form># views.py...class SearchView(TemplateView):    """Search view"""    def form_valid(self, form):        """redirect to the success url with url params"""        quoted_user_query = urllib.parse.quote_plus(form.cleaned_data['user_query'])        return HttpResponseRedirect(''.join([self.get_success_url(), quoted_user_query]))    def get_context_data(self. **kwargs):        context = super().get_context(**kwargs)        user_query = self.request.GET.get('q', None)        form.initial = {'user_query': user_query}        return context    def get_success_url(self):        """append success url with search query"""        if not self.success_url:            raise ImproperlyConfigured('No success url for {}'.format((str(self))))        return ''.join([str(self.success_url), '?q='])我第一次在浏览器中搜索时,模板按预期呈现。如果我搜索以下内容将呈现foo<form action="/search" method="post">    <input type="text" value="foo" name="search">    <input type="submit" value="Search"></form>但是,第二次搜索不会更改搜索栏中的字符串。如果我在搜索后搜索,搜索栏的值不会更改为预期。barfoobar<form action="/search" method="post">    <input type="text" value="foo" name="search">    <input type="submit" value="Search"></form>我做错了什么?下面是表单代码。# forms.pyfrom django import formsclass SearchBar(forms.Form):    user_query = forms.CharField()编辑:当我将 {{ form.initial.user_query }} 添加到模板时,预期值呈现为搜索栏旁边的文本,但不呈现在搜索栏中。# search_results.html{{ form.initial.user_query }}<form action="/search" method="post">    {% csrf_token %}    {{ form }}    <input type="submit" value="Search"></form>bar<form action="/search" method="post">    <input type="text" value="foo" name="search">    <input type="submit" value="Search"></form>
查看完整描述

2 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

我发现了一个笨拙的解决方案,可以创建表单的新实例,而不是更新属性initial


# views.py

...

class SearchView(TemplateView):

    """Search view"""

extra_context = {'form': SearchBar()}


    def get_context_data(self. **kwargs):

        context = super().get_context(**kwargs)

        user_query = self.request.GET.get('q', None)

        if user_query is not None:

            context['form'] = self.form_class(data={'user_query': user_query})

        return context

...


查看完整回答
反对 回复 2022-08-25
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

我不认为你得到任何值与,因为输入字段的名称在表单中。所以试试这个:self.request.GET.get('q', None)user_query


class SearchView(TemplateView):

    """Search view"""

    def get_context_data(self. **kwargs):

        context = super().get_context(**kwargs)

        user_query = self.request.GET.get('user_query', None)

        context['form'] = SearchBar(initial = {'user_query': user_query})

        return context

同时将表单方法从 post 更改为 get ie<form method='get' action='/search'>


查看完整回答
反对 回复 2022-08-25
  • 2 回答
  • 0 关注
  • 57 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信