Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django绑定表单无效,但未引发ValidationError_Python_Django_Forms_Validation - Fatal编程技术网

Python Django绑定表单无效,但未引发ValidationError

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

我的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',
                           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对您的友好帮助:)