【问题标题】:Pass an initial value to a Django form field将初始值传递给 Django 表单字段
【发布时间】:2010-12-25 08:29:09
【问题描述】:

Django 新手问题....

我正在尝试编写一个搜索表单,并在搜索请求和搜索结果之间保持输入框的状态。

这是我的表格:

class SearchForm(forms.Form):
    q = forms.CharField(label='Search: ', max_length=50)

这是我的观点代码:

def search(request, q=""):
    if (q != ""): 
        q = q.strip()
        form = SearchForm(initial=q) 
        #get results here...
        return render_to_response('things/search_results.html',
          {'things': things,  'form': form, 'query': q})
    elif (request.method == 'POST'): # If the form has been submitted
        form = SearchForm(request.POST) 
        if form.is_valid(): 
          q = form.cleaned_data['q']
          # Process the data in form.cleaned_data
          return HttpResponseRedirect('/things/search/%s/' % q) # Redirect after POST
        else:
          form = SearchForm() 
          return render_to_response('things/search.html', {
            'form': form,
          })
    else:
        form = SearchForm()
        return render_to_response('things/search.html', {
            'form': form,
        })

但这给了我错误:

Caught an exception while rendering: 'unicode' object has no attribute 'get'

如何传递初始值?我尝试过的各种事情似乎都会干扰 request.POST 参数。

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    这里有几件事不好......

    1) POST 后的建议是重定向。这样可以避免臭名昭著的弹出窗口说您在使用后退按钮时正在重新提交表单。

    2) 你不需要说if request.method == 'POST',只需说if request.POST。这使您的代码更易于阅读。

    3) 视图通常看起来像:

    def myview(request):
        # Some set up operations
        if request.POST:
           form=MyForm(request.POST)
           if form.is_valid():
              # some other operations and model save if any
              # redirect to results page
        form=MyForm()
        #render your form template
    

    这并不是说不能有更简单和更复杂的视图。但这是一个观点的要点:如果请求是后处理表单并重定向;如果请求获取,则呈现表单。

    我不知道您为什么会收到 unicode 错误。我只能认为它与您未提供的模型之一有关。 正如 spookylukey 在他的评论中提到的那样,该错误很可能是由于您向初始参数提交了字符串而不是 dict。

    我真的推荐 django 文档,在particular the tutorial.,但也有非常好的Django Book

    说了这么多,我想你想要这样的东西:

    def search(request, q=None):
        if request.POST:
            form = SearchForm(request.POST) 
            if form.is_valid(): 
               q = form.cleaned_data['q']
               url=reverse('search_results', args=(q,))
               return HttpResponseRedirect(url)
        if q is None:
            form = SearchForm() 
        else: 
            form = SearchForm(initial={'q': q})
        return render_to_response('things/search.html', {
            'form': form,
        })
    

    请注意,initial 的参数是表单字段值的字典。

    希望对您有所帮助。

    【讨论】:

    • 错误是由于传递了 unicode 对象而不是 dict。 (dict 定义了 'get()',但 string/unicode 没有)。
    • 啊,好点子。我看到了错误但没有建立连接!
    • 感谢详细的 cmets 和解决方案。我以这种方式实现它是因为我希望结果 URL 看起来像 /search/query(不过我知道这存在问题,并且可能会对其进行修改)。我在 POST 之后重定向,所以按下后退按钮没有问题。
    【解决方案2】:

    Django 表单对您的用例并不是特别有用。此外,对于搜索页面,最好使用 GET 表单并在 URL 中维护状态。以下代码更短、更简单,并且更符合 HTTP 标准:

    def search(request):
        q = request.GET.get('q','').strip()
        results = get_some_results(q)
        render_to_response("things/search.html", {'q': q, 'results': results})
    

    模板:

    <form method="GET" action=".">
    <p><input type="text" value="{{ q }}" /> <input type="submit" value="Search" /></p>
    {% if q %}
       {% if results %}
           Your results...
       {% else %}
           No results
       {% endif %}
    {% endif %}
    </form>
    

    【讨论】:

      猜你喜欢
      • 2011-11-22
      • 1970-01-01
      • 2014-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 2021-05-21
      相关资源
      最近更新 更多