2015-06-17 23 views
0

我有一個包含一個整數字段Django表單輸出/錯誤檢查問題

class myModel(models.Model): 
    number = models.IntegerField() 

每當我顯示或輸入數據到這個模式,我想在八進制這樣做的模型。當我填充我的編輯形式,我這樣做:

number = oct(numberObject.number).replace('Oo','') 

當我去它正是我想要的,但,當我嘗試做錯誤提交表單後檢查,以避免這一數字預填充編輯表單發生兩次我得到一個問題,因爲數字是在self.changed_data,因此我得到的錯誤,這個數字已經存在(基本上它發現自己,並說它是重複的)

我想不出一種方式來圖我是否試圖將數字更改爲已存在的數字,或者如果我只是提交數字而不更改數字。

我的表單/驗證碼:

class NumberForm(ModelForm): 
    number = forms.CharField(max_length = 10) 

    def clean_number(self): 
     """Ensures the new Number is unique 
     """ 
     enteredNumber = self.cleaned_data['number'] 

     changedFields = self.changed_data 
     if number.objects.filter(number__exact = int(enteredNumber,8)): 
      if 'number' in changedFields: 
       raise forms.ValidationError("Error") 
     return int(enteredNumber,8) 

    class Meta: 
     model = Number 
     fields = '__all__' 
+0

我也嘗試刪除.replace('Oo','')但沒有幫助。 – user2788328

+0

你能否包含你的表單和驗證碼? –

+0

添加表單/驗證碼 – user2788328

回答

1

您可編輯現有的對象,對不對? 我會簡單地從結果集排除:

def clean_number(self): 
    """Ensures the new Number is unique """ 
    enteredNumber = int(self.cleaned_data['number'], 8) 

    queryset = Number.objects.filter(number=enteredNumber) 
    if self.instance is not None and self.instance.pk is not None: 
     queryset = queryset.exclude(pk=self.instance.pk) 

    if queryset.exists(): 
     raise forms.ValidationError("Error") 
    return enteredNumber 

使用.exists()方法避免加載從數據庫中的對象,應該存在。

順便說一句,這種形式不能確保你不能創建重複。兩個線程可能同時運行驗證代碼,接受相同的值,然後繼續使用該值保存各自的對象。 如果您想確保沒有重複項,則必須在數據庫級別執行此操作(將unique=True傳遞到模型上的字段)。

+0

您可以給我一個self.instance的快速解釋我不完全確定這是做什麼。 – user2788328

+1

這是正在編輯的對象(或者如果您正在創建新對象,則爲None或空實例)。當它被視圖所立即執行時,它會被賦予表單。 – spectras