内联表单验证错误不在模板中

问题描述

我有这个模型:

class dateEvent(models.Model):

link = models.URLField(null=True,blank=True)
link_description = models.CharField(max_length=30,null=True,blank=True)
event = models.ForeignKey('Event',on_delete=models.CASCADE)

class Event(models.Model):
    title = models.CharField(max_length=200)

[...]

views.py:

def event_edit_view(request,id):
    event = get_object_or_404(Event,id=id)
    form_event = EventForm(request.POST or None),instance=event)
    DateEventFormSet = inlineformset_factory(Event,dateEvent,extra=5,can_delete=True,fields=('event','start_date_time','venue','link','link_description'),widgets={
    'venue': s2forms.Select2Widget(),'link': forms.TextInput(attrs={'placeholder': 'http://'}),'start_date_time': CalendarWidget(),'description_link': forms.TextInput(attrs={'placeholder': 'Link description'}),})
    form_date_event = DateEventFormSet(request.POST or None,instance=Event.objects.get(id=id),prefix="dateEvent",queryset=dateEvent.objects.filter(event__id=id))

    if request.method == "POST":

        if form_event.is_valid() and request.POST['action'] == 'submit':
            if form_date_event.is_valid():
                form_event.save()
                form_date_event.save()
                messages.success(request,'Event updated successfully. See the <a href="/event-detail/' + str(id) + '">detail page</a>')
                return redirect('my-events')
            else:
                raise forms.ValidationError(form_date_event.errors)

        elif form_event.is_valid() and form_date_event.is_valid() and request.POST['action'] == 'update':
            form_event.save()
            form_date_event.save()

        else:
            raise forms.ValidationError([form_event.errors,form_date_event.errors])

    context = {
        'event': event,'id': event.id,'form_event': form_event,'form_date_event': form_date_event,}

    return render(request,"events/event-edit.html",context)

和模板:

 <tbody id='date_body'>
  {{ form_date_event.management_form }}
  {{form_date_event}}
 </tbody>

当我在模板上输入非法数据(例如,URL 字段中的非 URL)时,Django 通过丑陋的调试界面抛出错误

ValidationError at myurl...

['Enter a valid URL.']

Request Method:     POST

如果关闭调试,则服务器错误 500。为什么我没有在模板上显示错误

解决方法

ValidationError 应该在表单而不是视图中引发。通过在视图中引发 ValidationError,您不会渲染模板。这解释了为什么您可以在调试数据中看到错误,但没有呈现页面。 500 错误很可能是因为您的视图在引发错误时没有返回 HTTP 响应。该文档提供了如何引发视图和表单错误的示例。

Django HTTP View Errors

Django Form Validation Errors