我遇到表单验证问题。这是我的clean方法的一部分(forms.py - 类SiteAddFormFull(forms.ModelForm)):
url = self.cleaned_data['url']
if self.check_url_in_database(url) is True:
errors.append('Url already exists')
if errors:
raise forms.ValidationError(errors)
return self.cleaned_data
这是check_url_in_database方法:
def check_url_in_database(self, url1):
if url1[7:10] == 'www':
url = 'http://' + url1[11:]
else:
url = url1.replace('http://', 'http://www.')
try:
Site.objects.get(url=url1)
return True
except ObjectDoesNotExist:
try:
Site.objects.get(url=url)
return True
except ObjectDoesNotExist:
return False
当我在我的django admin中创建新对象(Site)时,它工作正常(验证数据库中是否存在url)。当我尝试修改现有对象时出现问题。它会抛出相同的错误('Url已存在')。什么是仅验证新对象的正确方法?
答案 0 :(得分:1)
在您的模型表单中,您可以访问self.instance.pk
。如果主键存在,则将其从查询集中排除。
def check_url_in_database(self, url1):
if url1[7:10] == 'www':
url = 'http://' + url1[11:]
else:
url = url1.replace('http://', 'http://www.')
sites = Site.objects.all()
if self.instance.pk:
sites = sites.objects.exclude(pk=self.instance.pk)
try:
sites.get(url=url1)
return True
except ObjectDoesNotExist:
try:
sites.get(url=url)
return True
except ObjectDoesNotExist:
return False