2017-07-17 121 views
0

我有一个表单验证的问题。这是我的清洁方法的一部分(forms.py - 类SiteAddFormFull(forms.ModelForm)):Django管理 - 管理面板中的表单验证

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管理员工作正常(验证如果url存在于数据库中)。我尝试修改现有对象时出现问题。它会抛出相同的错误('Url already exists')。什么是验证新对象的正确方法?

+0

另外,我不清楚你在第一个if/else语句中要做什么。你有没有想过如何为https://工作? – Alasdair

+0

是的。你是对的 - 我忘了https。我会纠正这一点。 – jundymek

回答

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