Django ModelForm-条件验证

Django ModelForm-条件验证,django,validation,django-models,django-forms,Django,Validation,Django Models,Django Forms,我需要在我的模型表单中添加一个有条件的验证 下面是我的清单型号 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

我需要在我的模型表单中添加一个有条件的验证

下面是我的
清单
型号

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
如果类型=‘事件’,则仅要求场地。如果type='release',我希望要求地点=False

我该怎么办


首先感谢
列表。场馆
需要允许空值

venue = models.ForeignKey(Venue, blank=True, null=True)
然后,您的
ModelForm
需要一个。类似于下面的内容

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")

首先
列表。场馆
需要允许空值

venue = models.ForeignKey(Venue, blank=True, null=True)
然后,您的
ModelForm
需要一个。类似于下面的内容

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")

您提到过要进行
ModelForm
验证,但您应该问问自己,这条规则是否特定于使用表单创建对象,或者它是否是数据模型本身固有的。如果是后者,那么做更有意义

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所指出的,首先需要允许
vention
的空值

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

您提到过要进行
ModelForm
验证,但您应该问问自己,这条规则是否特定于使用表单创建对象,或者它是否是数据模型本身固有的。如果是后者,那么做更有意义

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所指出的,首先需要允许
vention
的空值

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

谢谢你的回答,但是你能解释一下你做了什么吗?我是初学者:)谢谢你的回答,但你能解释一下你做了什么吗?我是初学者:)