2017-07-17 19 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