Django:管理员中的验证错误

时间:2010-06-03 14:57:28

标签: django django-models django-admin

NEWBIE ALERT!

背景:

我第一次写了一个需要验证的模型。我不能有两个 Items 具有重叠的“日期范围”。我有一切正常工作,除非我提出forms.ValidationError,我得到死亡的黄色屏幕(debug = true)或500页面(debug = false)。

我的问题:

如何在管理员中显示错误消息(例如,当您将所需的字段留空时)?

对不起我的经验不足,如果我能更好地澄清问题,请告诉我。

Models.py

from django.db import models
from django import forms
from django.forms import ModelForm
from django.db.models import Q 

class Item(models.Model):
    name = models.CharField(max_length=500)
    slug = models.SlugField(unique=True)
    startDate = models.DateField("Start Date", unique="true")
    endDate = models.DateField("End Date")

    def save(self, *args, **kwargs):
        try:
            Item.objects.get(Q(startDate__range=(self.startDate,self.endDate))|Q(endDate__range=(self.startDate,self.endDate))|Q(startDate__lt=self.startDate,endDate__gt=self.endDate))

            #check for validation, which may raise an Item.DoesNotExist error, excepted below
            #if the validation fails, raise this error:

            raise forms.ValidationError('Someone has already got that date, or somesuch error message')

         except Item.DoesNotExist:
             super(Item,self).save(*args,**kwargs)          


    def __unicode__(self):
        return self.name

    def get_absolute_url(self):
        return "/adtest/%s/" % self.slug    

1 个答案:

答案 0 :(得分:2)

对于Django 1.2,请参阅http://docs.djangoproject.com/en/dev/ref/forms/validation/#using-validation-in-practice

在1.2之前的版本中,您必须为管理员制作自己的模型表单并将验证方法放在那里! http://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-a-specific-field-attribute

from django import forms
from models import Item

class ItemForm(forms.ModelForm):

   class Meta:
       model = Item

   def clean(self, value):
       data = self.cleaned_data
       start = data['startDate']
       end =  data['endDate']
       try:
           item = Item.objects.get(Q(startDate__range=(start,end))|\
                                   Q(endDate__range=(start,end))|\
                                   Q(startDate__lt=start,endDate__gt=end))
           raise forms.ValidationError('.....')
       except:
           pass

   return data 

然后输入您的管理员form=ItemForm并确保之前在某处定义表单! 有关详细说明,请参阅http://www.jroller.com/RickHigh/entry/django_admin_validation_of_multiple 为了配合django惯例你应该命名你的领域,例如。 end_date而非endDate。猜猜你甚至不需要再指定他们的verbose_name了!