Django POST表单验证到另一个页面

时间:2016-04-23 00:49:16

标签: python django forms

我正在尝试使用Django创建一个电视节目管理器,我遇到了表单验证和重定向问题。 我有一个简单的页面,其中有一个表单,人们可以搜索电视节目,以及另一个页面,其中显示查询的结果。 (对于查询我正在使用TVDB的API,我不知道它是否有用) 我想做的是:

  1. 如果我提交表单并且有错误会显示带有相关错误的表单
  2. 如果表单有效,请转到另一页,其中包含使用API​​进行查询的数据
  3. forms.py

    class SearchShowForm(forms.Form):
        query = forms.CharField(
            max_length=120,
            required=True,
            widget=TextInput(attrs={'class': 'form-control', 'placeholder': 'Search'})
        )
    

    views.py

    def step1(request):
            form = SearchShowForm()
            context = {'form': form, 'step': 1}
            return render(request, 'tvshows_manager/step_1.html', context)
    
    def step2(request):
        print(request.POST)
        if request.method == 'POST':
            form = SearchShowForm(request.POST)
            if form.is_valid():
                print(form.cleaned_data)
                return render(request, 'tvshows_manager/step_2.html', {'data': form.cleaned_data})
            else:
                return render(request, 'tvshows_manager/step_1.html', {'form': form})
        else:
            return HttpResponseRedirect('/step_1/')
    

    step_1.html的模板

    <form action="{% url 'step2' %}" class="form-inline" method="POST">
        {% csrf_token %}
        <input type="submit" value="Rechercher" class="btn btn-default">
        <div class="search-form-input">
            {{ form.query }}
        </div>
        {% if form.errors %}
            <p>Ce champs est nécessaire</p>
        {% endif %}
    </form>
    

    目前,如果我要进入step1页面并提交空白输入页面'step2'正在显示表单和错误,我想留在step1页面。

    提前致谢

1 个答案:

答案 0 :(得分:1)

根据您的说明和views.py,您将继续第2步,原因如下:

  1. 用户在页面&#39; / step_1 /&#39;
  2. 他提交表格
  3. 因为表格中的行动参数指向&#39; / step_2 /&#39;,它会转到该网址
  4. 查看request.method ==&#39; POST&#39;是的,但表格无效。
  5. 您正在使用&#39; / step_1&#39;呈现模板,但不会重定向用户。
  6. 以下是示例修复:

    def step2(request):
        print(request.POST)
        if request.method == 'POST':
            form = SearchShowForm(request.POST)
            if form.is_valid():
                print(form.cleaned_data)
                return render(request, 'tvshows_manager/step_2.html', {'data': form.cleaned_data})
            else:
                return HttpResponseRedirect('/step_1/')
        else:
            return HttpResponseRedirect('/step_1/')