亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

更新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 關注
  • 103 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號