Django中的表单视图映射问题

时间:2014-07-27 23:29:04

标签: python html django twitter-bootstrap python-3.x

这变得非常令人沮丧,就像我迄今为止所有的Django形式的努力......

我有一个搜索栏表单应该将用户发送到网址'/project/search/<query>/',如果我输入网址但我的表单未正确映射,则网址工作正常。我首先在搜索结果页面中实现了这一点,它仍会有一个搜索栏,每当我在搜索栏中输入一个值时,我都会被重定向到&#39; / project / search /&#39;。我哪里出错了?我花了两天时间在这上面无济于事。

我真的很挣扎,我不知道我做错了什么。我希望我至少有一个错误或需要解决的问题,但这不起作用。

这是我的表单类和视图:

    from django import forms

    class SearchForm(forms.Form):
        search_string = forms.CharField(initial='Search Article Text',max_length=100)

def search(request, search_query):  

form = SearchForm()
context = RequestContext(request)
search_string = search_query.replace('_',' ')
search_terms = search_query.split('_')
search_results = Article.objects.all()
for term in search_terms:
    search_results = search_results.filter(article__icontains=term)

context_dict = {
    'search_string':search_string,
    'search_results':search_results,
    'form':form,
    }


if request.method == 'POST':
    form = SearchForm(request.POST)
    context_dict['form'] = form
    if form.is_valid():
        search_string = form.cleaned_data['search_string']
        search_query = search_string.replace(' ','_')
        ###return HttpResponseRedirect(reverse('search', args=(search_query,)))
        search_url = '/project/search/' + search_query + '/'
        return HttpResponseRedirect(search_url)
return render_to_response('search.html', context_dict, context)

html:

<form action='/beacon/search/' class="navbar-form navbar-right" method='POST'>
              <div class="form-group">
                {% csrf_token %}
                {{ form.search_string }}
              </div>
              <input type='submit' value='Submit' class='btn btn-default'/>
            </form>

2 个答案:

答案 0 :(得分:1)

我真的不明白你的问题。您正在重定向,因为这是您告诉视图要执行的操作:您显式返回HttpResponseRedirect。如果您不想重定向,请不要这样做。

答案 1 :(得分:0)

好了5天左右的故障排除后,我已经意识到我的问题是什么(我也得到了Django用户Google小组的帮助)。

我正在回答这个问题,以防任何人在将来也遇到我的问题。我显然不是Django表单部分的专家。

这一切都与我的实际HTML写作有关。在我的表单标签中,操作是'/ project / search /',它只是将我重定向到该URL,因为django think / project / search /与project / search / query不同。因此,我需要为此部分做的就是更改动作以引用任何可以验证我的搜索视图的URL - 所以我选择了/ project / search / search_query /但是/ project / search /之后的任何内容都有效。

我的第二个问题是我的意见。我需要在输入中包含一个名称-'search_string' - 所以我的搜索视图会理解表单本身带有什么值。

因此我的html最终看起来像:

<form action='/beacon/search/search_query/' class="navbar-form navbar-right" method='POST'>
              <div class="form-group">
                {% csrf_token %}
                <input type="text" name='search_string' class="form-control" placeholder="Search Article Text"/>
              </div>
              <!--<button type="submit" class="btn btn-default" value='Submit'>Submit</button>-->
              <input type='submit' value='Submit' class='btn btn-default'/>
            </form>

感谢Branko Majic帮助我的DJ用户群。严重。