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
答案 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了!