【问题标题】:invalid django form makes is_valid method always return false无效的 django 表单使 is_valid 方法总是返回 false
【发布时间】:2018-02-03 18:17:38
【问题描述】:

我的 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 })

模板名称1

   <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>

模板名称2

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

网址/乘法

   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')
   ]

【问题讨论】:

    标签: python django forms user-interface


    【解决方案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} )
    

    【讨论】:

    • 但是我应该如何更改 urls.py ?
    猜你喜欢
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2018-01-22
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多