2013-08-20 47 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 

需要場地,如果類型== '事件'。如果鍵入=='釋放',我想要地點被要求=錯誤

我該如何解決這個問題?

感謝

回答

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)