1

我创建了一个包含最少字段的表单(用于测试),但它从未进入form.is_valid()

这是最小的代码

模型.py

 from django.db import models

 class sample(models.Model):
      field1=models.CharField(max_length=100)
      field2=models.CharField(max_length=100)

在forms.py

from django.forms import ModelForm
from app.models import sample

class someform(ModelForm):
      class Meta:
        model=sample

在views.py

some imports

def index(request):
    return render(request, 'app/index.html')

def contact(request):
    if request.method=='POST':
         form=someform(request.POST)
         if form.is_valid():
            field1=form.cleaned_data['field1']
            field2=form.cleaned_data['field2']
            return HttpResponse("valid")
         else:
            return HttpResponse("invalid")
    else:
            form=someform()
            return HttpResponse("error")

问题是,它永远不会进入 (if form.is_valid()) 。我错过了什么吗?请帮忙

在 index.html 中

<html>
      <body bgcolor="#2E9AFE">
      <form action="contact" method="post" enctype="multipart/form-data">
      {% csrf_token %}
      <input type="text" id="field1" name="field1">
      <input type="text" id="field2" name="field2">
      <input type="submit" id="submit" name="submit">
      </form></body></html>
4

2 回答 2

4

当请求不在views.py中POST时,首先将您的表单传递给index.html:

else:
            form=someform()
            return render(request, 'index.html', locals())

在模板中,您应该像这样:

<form action="contact" method="POST" xmlns="http://www.w3.org/1999/html">
    {% csrf_token %}
        {{ form.as_p }}
        <button type="submit" class="btn">Submit</button>
</form>
于 2013-08-01T12:31:10.643 回答
3

收到 POST 查询时,Django 正在查找 IDid_field1和2 个字段id_field2,因此您的 HTML 如下所示:

<html>
   <body bgcolor="#2E9AFE">
      <form action="contact" method="post" enctype="multipart/form-data">
        {% csrf_token %}
         <input type="text" id="id_field1" name="field1">
         <input type="text" id="id_field2" name="field2">
         <input type="submit" id="submit" name="submit">
         </form>
   </body>
</html>

另一种解决方案是使用{{ form.as_p }}or{{ form.as_table }}在里面渲染输入

或自动标记。

您还可以在当前 HTML 中添加{{ form.non_field_errors }}{{ form.field1.errors }}和,以在验证失败时显示表单错误。{{ form.field2.errors }}

于 2013-08-01T12:31:38.830 回答