我要处理的问题是格式错误“输入由字母,数字,下划线或连字符组成的有效'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()
。你知道为什么吗?
答案 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