【问题标题】:Django: Validation error in AdminDjango:管理员中的验证错误
【发布时间】:2010-06-03 14:57:28
【问题描述】:

NEWBIE 警报!

背景:

我第一次编写需要验证的模型。我不能有两个“日期范围”重叠的 Items。我一切正常,除了当我提出 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 django-models django-admin


    【解决方案1】:

    对于 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 了!

    【讨论】:

    • 我使用的是 1.2.1,并且我已经阅读了该链接。我仍然不知道如何在 Admin 中使用它
    • 这里还有一个新帖子处理同样的问题:stackoverflow.com/questions/2973442/…
    • 如果约束必须应用到任何地方,验证逻辑应该放在模型本身,而不是模型表单中,因为只有管理员而不是所有代码都会使用模型表单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 2011-07-03
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    相关资源
    最近更新 更多