为什么表单不显示字段错误并提交空白或无效的表单?

Why the form doesn't show field errors and submits the form blank or invalid?

我正在创建一个表单,其中的字段具有正则表达式验证器。但是当我提交空白表单时,它不会提示用户输入必填字段或验证错误。它只是将用户重定向到 /data/ 的“ValueError” 无法创建 InitialData,因为数据未验证。'

回溯:

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/data/

Django Version: 3.2.4
Python Version: 3.9.5
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'account']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback (most recent call last):
  File "C:\Users\ceo\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\ceo\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "E:\Sonu\Projects\Billing\rough\account\views.py", line 10, in initialview
    fm.save()
  File "C:\Users\ceo\AppData\Local\Programs\Python\Python39\lib\site-packages\django\forms\models.py", line 460, in save
    raise ValueError(

Exception Type: ValueError at /data/
Exception Value: The InitialData could not be created because the data didn't validate.

models.py:

from django.db import models
from django.core.validators import RegexValidator

# Create your models here.
class InitialData(models.Model):
    pattern = RegexValidator(r'OOPL\/D\/[0-9]', 'Enter Case Number properly!')
    case_number=models.CharField(max_length=12, blank=False, primary_key=True, validators=[pattern])

forms.py:

from django import forms
from django.forms import ModelForm, fields
from .models import InitialData

class TrackReportForm(forms.ModelForm):
    class Meta:
        model=InitialData
        fields='__all__'

views.py:

from django.shortcuts import render
from .forms import TrackReportForm
from .models import InitialData

# Create your views here.
def initialview(request):
    if request.method=='POST':
        fm=TrackReportForm(request.POST)
        if fm.is_valid:
            fm.save()
        return render(request, 'account/database.html', {'form':fm})
    else:
        fm=TrackReportForm()
        return render(request, 'account/database.html', {'form':fm})

database.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="" method="post" novalidate>
        {% csrf_token %}
        {{form}} {{field.errors}}
        <input type="submit" value="Submit">
    </form>
</body>
</html>

网址:

from django.contrib import admin
from django.urls import path
from account import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('data/', views.initialview),
]

我哪里错了?

您需要更改:

if fm.is_valid:
    fm.save()

到括号下面的代码():

if fm.is_valid():
    fm.save()

请参阅文档 here is_valid()