新手警报!
背景:
这是我第一次编写需要验证的模型。我不能拥有两个具有重叠“日期范围”的项目。我一切正常,除了当我引发 forms.ValidationError 时,我得到死亡蓝屏(debug=true)或 500 页(debug=false)。
我的问题:
如何在管理员中显示错误消息(例如,当您将必填字段留空时)?
抱歉,我的经验不足,如果我可以更好地澄清问题,请告诉我。
模型.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
最佳答案
对于 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 了!
关于Django:管理中的验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2967110/