Django:管理中的验证错误

标签 django django-models django-admin

新手警报!

背景:

这是我第一次编写需要验证的模型。我不能拥有两个具有重叠“日期范围”的项目。我一切正常,除了当我引发 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/

相关文章:

python - 扩展 Django 用户模型并访问它

python - 首次部署时的 Djangosyncdb

python - 在 Django 中使用抽象多重继承时外键冲突

python - Django:获取模板中管理页面的链接

Django:如何将初始值设置为 formset 的 empty_form?

python - Django IntegrityError-NOT NULL 约束失败 : portfolio_myportfolio.holder_id

python - Django 中的 for 循环

Django 模型更改未反射(reflect)在 Postgres Docker 容器中

python - Django 中的三元模型关联

模板标签和反向函数中的django管理冒号语法