无效的django表单使得is_valid方法始终返回false

时间:2018-02-03 18:17:39

标签: python django forms user-interface

我的django表单无效,因此.is_valid方法永远不会返回true。结果,我得到了一个"预期的HttpResponse,但收到了没有"错误的类型,因为我的代码永远不会执行if条件中的内容。我想知道如何使我的表格有效。我是django的新手,所以我可能会遗漏一些明显的东西。这是我的代码:

views.py

  template_name1 = 'multiplication/detail.html'
  template_name2 = 'multiplication/multiplied.html'

  class myForm(forms.Form):
    quantity1 = forms.IntegerField(required=False)
    quantity2 = forms.IntegerField(required=False)

  form = myForm()

  def get(request):
    return render(request,template_name1,{'form': form} )

  def multiply_two_integers(x,y):
    return x*y

  def post(request):
    if (form.is_valid()):
      x = request.POST.get('quantity1')
      y = request.POST.get('quantity2')
      product = multiply_two_integers(x, y)
      return render(request, template_name2, {'form': form, 'product': 
      product })

template_name1

   <h1>Multiplication Function</h1>
   <form action =  "{% url 'multiplication:post' %}" method = "post">
   {{ form.as_p  }}
   {% csrf_token %}
   <input type = "submit" value ="Multiply">
   <!--<button type="submit"> Multiply </button>-->
   <h1>{{product}}</h1>
   </form>

template_name2

   <h1>{{product}}</h1>

的URL /乘法

   from django.urls import path
   from multiplication import views
   app_name = 'multiplication'
   urlpatterns = [
   # /multiplication/
   path('', views.get, name = 'get'),
   path('multiplied', views.post, name='post')
   ]

1 个答案:

答案 0 :(得分:1)

这段代码很奇怪。您似乎有一组功能视图,但试图从基于类的视图中随机使用一些概念。

您的表单无效的原因是您从未向其传递任何数据;未绑定的表单无效。你不应该在视图之外实例化表单;你需要在视图中执行它,当请求是POST时,你应该将POST数据传递给它。

在基于函数的视图中,您不应为get和post定义单独的函数。将它们组合在一起,就像在Django文档中播种一样。

还有一点是你错过了错误信息;你对它的反应告诉你,如果表单无效,你没有回复你的回答是问“为什么它不是有效的”,但是你应该做它说的话并返回一个回复这个案例;表格有时实际上是无效的,你应该处理这个案子。

最后,要从表单中获取数据,您应该使用form.cleaned_data,而不是request.POST

def multiply_two_integers(x,y):
    return x*y

def my_view(request):
    if request.method == 'POST':
        form = MyForm(request.POST)
        if (form.is_valid()):
            x = form.cleaned_data['quantity1']
            y = form.cleaned_data['quantity2']
            product = multiply_two_integers(x, y)
            return render(request, template_name2, {'product': product })
    else:
        form = MyForm()
    return render(request,template_name1,{'form': form} )