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)
谢谢你的回答,但是你能解释一下你做了什么吗?我是初学者:)谢谢你的回答,但你能解释一下你做了什么吗?我是初学者:)