2013-08-20 5 views
1

Мне нужно добавить условную часть проверки в модель ModelForm.Django ModelForm - условная проверка

Ниже представлена ​​моя модель Listing.

LISTING_TYPES = (
    ('event', 'event'), 
    ('release', 'release') 
) 

class Listing(models.Model): 
    title = models.CharField(max_length=255, verbose_name='Listing Title') 
    type = models.CharField(max_length=255, choices=LISTING_TYPES, verbose_name='Listing Type') 
    slug = models.SlugField(max_length=100) 
    content = models.TextField(verbose_name='Listing Overview') 
    competition = models.TextField() 
    date_start = models.DateTimeField() 
    time_start = models.CharField(max_length=255) 
    date_end = models.DateTimeField() 
    time_end = models.CharField(max_length=255) 
    pub_date = models.DateTimeField('date published', auto_now_add=True) 
    venue = models.ForeignKey(Venue) 

class ListingForm(ModelForm): 
    date_start = forms.DateField(input_formats=DATE_INPUT_FORMATS) 
    date_end = forms.DateField(input_formats=DATE_INPUT_FORMATS) 
    class Meta: 
     model = Listing 

Место должно требуется только если тип == 'событие'. Если тип == 'release', я хочу, чтобы место встречи было обязательным = False

Как я могу это сделать?

Благодаря

ответ

4

Listing.venue Сначала необходимо разрешить нулевые значения

venue = models.ForeignKey(Venue, blank=True, null=True) 

Ваш ModelForm тогда нужен clean method. Что-то вроде следующего

def clean(self): 
    cleaned_data = super(ListingForm, self).clean() 
    venue = cleaned_data.get("venue") 
    type = cleaned_data.get("type") 

    if type == 'event' and not venue: 
     raise forms.ValidationError("A venue is required for events") 
2

Вы упомянули делать ModelForm проверки, но вы должны спросить себя, если это правило специфично для создания объектов с формами, или это присуще вашей модель данных сам по себе. Если это последнее, то делать model validation имеет больше смысла.

from django.core.exceptions import ValidationError 

class Listing(models.Model): 
    ... 
    def clean(self): 
     super(Listing, self).clean() 

     if self.type == 'event' and not self.venue: 
      raise ValidationError('A venue is required for events') 

Это будет называться во время ModelForm проверки, поэтому он будет иметь тот же эффект, но определение его модель позволяет проверить согласованность данных в любой момент с помощью метода Model.full_clean().

Как указывает Iain, сначала необходимо разрешить нулевые значения для venue.

venue = models.ForeignKey(Venue, blank=True, null=True)