Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:管理中的验证错误_Django_Django Models_Django Admin - Fatal编程技术网

Django:管理中的验证错误

Django:管理中的验证错误,django,django-models,django-admin,Django,Django Models,Django Admin,新手警报 背景: 这是我第一次编写一个需要验证的模型。我不能有两个“日期范围”重叠的项目。我所有的东西都在工作,除了当我提出forms.ValidationError时,我会看到死亡的黄屏(debug=true)或500页(debug=false) 我的问题: 我怎样才能在管理员中显示错误消息(例如,当您将所需的文件留空时) 对不起,我没有经验,如果我能更好地澄清这个问题,请告诉我 Models.py from django.db import models from django import

新手警报

背景:

这是我第一次编写一个需要验证的模型。我不能有两个“日期范围”重叠的项目。我所有的东西都在工作,除了当我提出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    
有关Django 1.2,请参见

在1.2之前的版本中,您必须为管理员制作自己的模型表单,并将验证方法放在那里

然后输入你的admin
form=ItemForm
,确保在之前的某个地方定义表单! 有关更详细的说明,请参阅。

为了进一步分类到django约定,您应该命名您的字段,例如
end\u date
,而不是
endDate
。我猜你甚至不再需要指定他们的详细名称了

我正在使用1.2.1,我已经阅读了该链接。我仍然不知道如何在AdminForm中使用它。这里还有一篇新的帖子处理同样的问题:如果约束必须在任何地方应用,那么验证逻辑应该放在模型本身中,而不是放在modelform中,因为只有admin而不是所有的代码将使用modelform。
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