Python Django绑定表单无效,但未引发ValidationError
我的Django表格有问题。单击表单中的“提交”按钮时,不会将任何数据保存到数据库中。我发现数据是绑定的,但它没有通过Python Django绑定表单无效,但未引发ValidationError,python,django,forms,validation,Python,Django,Forms,Validation,我的Django表格有问题。单击表单中的“提交”按钮时,不会将任何数据保存到数据库中。我发现数据是绑定的,但它没有通过表单。is\u valid()函数。下面是分别用于forms.py、views.py、url.py和new event.html的代码: forms.py from django import forms class EventForm(forms.Form): name = forms.CharField(label='event-name',
表单。is\u valid()
函数。下面是分别用于forms.py
、views.py
、url.py
和new event.html
的代码:forms.py
from django import forms
class EventForm(forms.Form):
name = forms.CharField(label='event-name',
max_length=50,
widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'event-name', 'name': 'event-name'}))
start_datetime = forms.DateTimeField(
widget=forms.DateTimeInput(attrs={'class': 'form-control', 'id': 'start-datetime', 'name': 'start-datetime', 'type': 'datetime-local'}))
end_datetime = forms.DateTimeField(
widget=forms.DateTimeInput(attrs={'class': 'form-control', 'id': 'end-datetime', 'name': 'end-datetime', 'type': 'datetime-local'}))
event_category = forms.ChoiceField(widget=forms.Select(attrs={'class': 'custom-select', 'id': 'event-type'}),
choices=((None, 'Please select an option'), ('Daily Life', 'Daily Life'), ('Study', 'Study'), ('Social', 'Social'), ('Work', 'Work')))
description = forms.CharField(max_length=250, widget=forms.Textarea(attrs={'class': 'form-control', 'id': 'description', 'name': 'description'}), required=False)
from django.shortcuts import render, redirect
from .models import Entry
from .forms import EventForm
from django.views.decorators.http import require_POST
# request is required that represents HttpResponse
# return value can be response, JSON or template
def index(request):
entries = Entry.objects.order_by('-date_added')
context = {'entries': entries}
return render(request, 'event/list-events.html', context)
def new_event(request):
form = EventForm()
context = {'form': form}
return render(request, 'event/new-event.html', context)
@require_POST
def add_event(request):
if request.method == 'POST':
form = EventForm(request.POST)
if form.is_bound: print('form is bound')
else: print('form is unbound')
if form.is_valid():
print('form is valid')
new_entry = Entry(name=form.cleaned_data['name'], start_datetime=form.cleaned_data['start_datetime'],
end_datetime=form.cleaned_data['end_datetime'], category=form.cleaned_data['event_category'],
description=form.cleaned_data['description'])
new_entry.save()
else:
print('form is invalid')
return render(request, 'event/new-event.html', {'form': form})
return redirect('index')
# else:
# form = EventForm()
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('new-event/', views.new_event, name='new_event'),
path('add-event/', views.add_event, name='add_event')
]
views.py
from django import forms
class EventForm(forms.Form):
name = forms.CharField(label='event-name',
max_length=50,
widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'event-name', 'name': 'event-name'}))
start_datetime = forms.DateTimeField(
widget=forms.DateTimeInput(attrs={'class': 'form-control', 'id': 'start-datetime', 'name': 'start-datetime', 'type': 'datetime-local'}))
end_datetime = forms.DateTimeField(
widget=forms.DateTimeInput(attrs={'class': 'form-control', 'id': 'end-datetime', 'name': 'end-datetime', 'type': 'datetime-local'}))
event_category = forms.ChoiceField(widget=forms.Select(attrs={'class': 'custom-select', 'id': 'event-type'}),
choices=((None, 'Please select an option'), ('Daily Life', 'Daily Life'), ('Study', 'Study'), ('Social', 'Social'), ('Work', 'Work')))
description = forms.CharField(max_length=250, widget=forms.Textarea(attrs={'class': 'form-control', 'id': 'description', 'name': 'description'}), required=False)
from django.shortcuts import render, redirect
from .models import Entry
from .forms import EventForm
from django.views.decorators.http import require_POST
# request is required that represents HttpResponse
# return value can be response, JSON or template
def index(request):
entries = Entry.objects.order_by('-date_added')
context = {'entries': entries}
return render(request, 'event/list-events.html', context)
def new_event(request):
form = EventForm()
context = {'form': form}
return render(request, 'event/new-event.html', context)
@require_POST
def add_event(request):
if request.method == 'POST':
form = EventForm(request.POST)
if form.is_bound: print('form is bound')
else: print('form is unbound')
if form.is_valid():
print('form is valid')
new_entry = Entry(name=form.cleaned_data['name'], start_datetime=form.cleaned_data['start_datetime'],
end_datetime=form.cleaned_data['end_datetime'], category=form.cleaned_data['event_category'],
description=form.cleaned_data['description'])
new_entry.save()
else:
print('form is invalid')
return render(request, 'event/new-event.html', {'form': form})
return redirect('index')
# else:
# form = EventForm()
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('new-event/', views.new_event, name='new_event'),
path('add-event/', views.add_event, name='add_event')
]
url.py
from django import forms
class EventForm(forms.Form):
name = forms.CharField(label='event-name',
max_length=50,
widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'event-name', 'name': 'event-name'}))
start_datetime = forms.DateTimeField(
widget=forms.DateTimeInput(attrs={'class': 'form-control', 'id': 'start-datetime', 'name': 'start-datetime', 'type': 'datetime-local'}))
end_datetime = forms.DateTimeField(
widget=forms.DateTimeInput(attrs={'class': 'form-control', 'id': 'end-datetime', 'name': 'end-datetime', 'type': 'datetime-local'}))
event_category = forms.ChoiceField(widget=forms.Select(attrs={'class': 'custom-select', 'id': 'event-type'}),
choices=((None, 'Please select an option'), ('Daily Life', 'Daily Life'), ('Study', 'Study'), ('Social', 'Social'), ('Work', 'Work')))
description = forms.CharField(max_length=250, widget=forms.Textarea(attrs={'class': 'form-control', 'id': 'description', 'name': 'description'}), required=False)
from django.shortcuts import render, redirect
from .models import Entry
from .forms import EventForm
from django.views.decorators.http import require_POST
# request is required that represents HttpResponse
# return value can be response, JSON or template
def index(request):
entries = Entry.objects.order_by('-date_added')
context = {'entries': entries}
return render(request, 'event/list-events.html', context)
def new_event(request):
form = EventForm()
context = {'form': form}
return render(request, 'event/new-event.html', context)
@require_POST
def add_event(request):
if request.method == 'POST':
form = EventForm(request.POST)
if form.is_bound: print('form is bound')
else: print('form is unbound')
if form.is_valid():
print('form is valid')
new_entry = Entry(name=form.cleaned_data['name'], start_datetime=form.cleaned_data['start_datetime'],
end_datetime=form.cleaned_data['end_datetime'], category=form.cleaned_data['event_category'],
description=form.cleaned_data['description'])
new_entry.save()
else:
print('form is invalid')
return render(request, 'event/new-event.html', {'form': form})
return redirect('index')
# else:
# form = EventForm()
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('new-event/', views.new_event, name='new_event'),
path('add-event/', views.add_event, name='add_event')
]
newevent.html
{% extends 'todo/base.html' %}
{% block title %}New Entry{% endblock %}
{% block content %}
<form action="{% url 'add_event' %}" method="POST" class="container-fluid">
{% csrf_token %}
<div class="form-group row">
<label for="event-name" class="col-sm-2 col-form-label">Event</label>
<div class="col-sm-10">
{{ form.name }}
</div>
</div>
<div class="form-group row">
<label for="event-type" class="col-sm-2 col-form-label">Event type</label>
<div class="col-sm-10">
{{ form.event_category }}
</div>
</div>
<div class="form-group row">
<label for="start-datetime" class="col-sm-2 col-form-label">Start Time</label>
<div class="col-sm-10">
{{ form.start_datetime }}
</div>
</div>
<div class="form-group row">
<label for="end-datetime" class="col-sm-2 col-form-label">End Time</label>
<div class="col-sm-10">
{{ form.end_datetime }}
</div>
</div>
<div class="form-group">
{{ form.description }}
</div>
<input type="submit" name="submit" value="Submit" class="btn btn-primary">
</form>
{% endblock %}
{%extends'todo/base.html%}
{%block title%}新条目{%endblock%}
{%block content%}
{%csrf_令牌%}
事件
{{form.name}
事件类型
{{form.event_category}
开始时间
{{form.start_datetime}
结束时间
{{form.end_datetime}
{{form.description}}
{%endblock%}
我的终端上的输出是:
表单已绑定表单无效
。。。我确信我不会陷入绑定和实例之间概念的混乱。有谁能告诉我这是怎么发生的吗?我不知道你为什么认为这是个问题。您的表单已正确绑定到POST数据;然后,对该数据进行了验证,发现未通过验证
要了解原因并允许用户更正问题,您应该在模板上输出
{{form.errors}
,或者为每个字段使用单独的errors属性,例如{{form.name.errors}}
等。如果我问了一个愚蠢的问题,请原谅,因为我是Django的新手。您的意思是POST数据已经过验证,因此表单中的POST数据会失败。条件是否有效?是的。我不知道是什么让你困惑,好吧。我目前的问题是,我无法从表单中获取start\u datetime
和end\u datetime
字段。已清理的\u数据
字典在清理后不包含这些字段。这是我读到的:“如果您的数据未验证,则已清理的数据字典仅包含有效字段。”我还检查了原始数据是否同时包含日期值和有效字段。那么,我如何从已清理的\u数据中访问这两个日期值呢?嗯,同样,它们不在那里,因为字段无效,表单。错误将告诉您原因。打印表单。错误显示:- 开始日期时间
- 输入有效的日期/时间。
结束日期时间- 输入有效的日期/时间。
。有人遇到了同样的情况,答案是在DateTimeField
的forms.py中指定input\u格式。我照做了,但仍然显示相同的错误消息。最后,我找到了无法成功将数据保存到数据库的原因。原因是start\u datetime
和end\u datetime
被指定为input type=datetime\u local
,与默认类型input type=text
不同,当前版本的Django不完全支持这一点。看见感谢@Daniel Roseman对您的友好帮助:)