如何在Django中显示自定义错误?

时间:2015-03-28 01:34:15

标签: html django python-3.x django-forms

我是Django的新手,这是我到目前为止所做的。

我想接收CharField数据并将其验证为URL。我做了以下事情。

models.py

from django.db import models

class Small(models.Model):
    url_new = models.CharField(max_length=500, default='abc', unique=True)

def __str__(self):
        return self.url_new

views.py

from django.shortcuts import render, HttpResponseRedirect, Http404
from django.core.validators import URLValidator
from django.core.exceptions import ValidationError

from .forms import SmallForm, URLForm
from .models import Small
def home(request):
    form = SmallForm(request.POST or None)
    if form.is_valid():
        url_validate = URLValidator()
        url_new = form.cleaned_data['url_new']

        try:
            url_validate(url_new)
        except ValidationError:
            raise form.fields['url_new'].error_messages['Invalid URL']

    context = {"form": form}
        template = "home.html"
        return render(request, template, context)

forms.py

from django import forms

from .models import Small


class URLForm(forms.Form):
    url_new = forms.CharField()


class SmallForm(forms.ModelForm):
    class Meta:
        model = Small
        fields = ["url_new", ]

所以,我可以在html页面上验证表单,但只有当表单为空时我点击提交按钮。

但是当我在表单字段中输入非url内容后点击提交时,它会转到新页面并显示error_messages Invalid URL(当调试为真时)。< / p>

有什么方法可以验证它并在html页面上显示错误消息而不是向我显示调试页面?

提前致谢。

1 个答案:

答案 0 :(得分:1)

在检查表单is_valid()

之前,您应该在表单中进行数据验证

<强> forms.py

class SmallForm(forms.ModelForm):

    def clean_url_new(self):
        data = self.cleaned_data['url_new']
        try:
            url_validate(data)
        except ValidationError:
            raise self.fields['url_new'].error_messages['Invalid URL']
        return data


    class Meta:
        model = Small
        fields = ('url_new', )

<强> views.py

def home(request):
    if request.method == 'POST':
        form = SmallForm(request.POST)
        if form.is_valid():
            # form success logic
            return HttpResponseRedirect('/thanks/')
    else:
        form = SmallForm()

    return render(request, 'home.html', {'form': form})

文档:https://docs.djangoproject.com/en/1.7/ref/forms/validation/#cleaning-a-specific-field-attribute