【问题标题】:Django ModelForm - conditional validationDjango ModelForm - 条件验证
【发布时间】:2013-08-22 05:49:40
【问题描述】:

我需要向我的 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

地点应该在 type == 'event' 时是必需的。如果 type == 'release',我希望场地是必需的=False

我该怎么办?

谢谢

【问题讨论】:

    标签: django validation django-models django-forms


    【解决方案1】:

    首先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)
    

    【讨论】:

      猜你喜欢
      • 2012-09-30
      • 2013-11-26
      • 2011-01-09
      • 2012-05-23
      • 2011-03-13
      • 2016-05-07
      • 2011-01-13
      • 2016-03-02
      相关资源
      最近更新 更多