Django:删除/的子弹

时间:2019-01-25 22:29:55

标签: python django

我要处理的问题是格式错误“输入由字母,数字,下划线或连字符组成的有效'slug'。”

以下是我的表单字段验证:

def clean_slug(self):
        slug = self.cleaned_data['slug']
        if slug.endswith('/'):
            self.cleaned_data['slug'] = slug[:-1]
        slug_check = self.organizer.events.filter(slug=slug).exclude(pk=self.event.pk).exists()
        if slug_check:
            raise forms.ValidationError(_("Slug already exists"), code='duplicated_slug')
        return slug

在调用self.cleaned_data['slug'] = slug[:-1]时,Django不考虑我的is_valid()。你知道为什么吗?

1 个答案:

答案 0 :(得分:1)

您正在修改cleaned_data['slug'],它将无效。 Django将使用您从此方法返回的内容,并且您将返回原始的(未修改的)slug。来自documentation

  

此方法的返回值替换了cleaned_data中的现有值,因此它必须是cleaned_data中的字段值(即使此方法未更改)或新的cleaned值。

将其更改为:

def clean_slug(self):
    slug = self.cleaned_data['slug']
    if slug.endswith('/'):
        slug = slug[:-1]  # <-- Modify slug, not cleaned_data['slug']
    slug_check = self.organizer.events.filter(slug=slug).exclude(pk=self.event.pk).exists()
    if slug_check:
        raise forms.ValidationError(_("Slug already exists"), code='duplicated_slug')
    return slug  # <-- return modified value