Django: ошибка проверки в Admin - PullRequest
3 голосов
/ 03 июня 2010

NEWBIE ALERT!

фон:

Впервые я пишу модель, которую необходимо проверить. У меня не может быть двух элементов , имеющих перекрывающиеся «диапазоны дат». У меня все работает, кроме случаев, когда я поднимаю формы. ValidationError, я получаю желтый экран смерти (debug = true) или 500 страниц (debug = false).

Мой вопрос:

Как я могу отобразить сообщение об ошибке в Admin (например, если вы оставите поле незаполненным)?

Извините за мою неопытность, пожалуйста, дайте мне знать, если я смогу прояснить вопрос лучше.

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    

1 Ответ

2 голосов
/ 03 июня 2010

Для 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, тогда!

...