2015-09-25 35 views
0

我正在使用django 1.7 & python 2.7。django python動態max_length基於選擇列表值

我有一個模型類,它允許用戶的文本區域和文本框輸入。

If用戶在選擇列表中選擇0,then文本框被顯示給用戶,用於輸入和文本區域被隱藏else顯示文本區域並從用戶隱藏的文本框中。

文本框和文本區域都有完全相同的輸入。在文本框中輸入什麼都會出現在文本區域,反之亦然。

文本框和文本區域都有不同的maxlength/max_length值。

文本框有250的最大長度和文本區域有5000

我有客戶端驗證工作的最大長度,但我有困難得到服務器端驗證工作。

當文本框和文本區域具有不同的max_length值,但輸入長度相同時,如何在forms.py文件中啓用/禁用服務器端驗證模型?

據我所知,max_length可以在forms.py上賦值,但是我無法獲得正確的代碼語法。

這裏是我的models.py代碼:

workplace_training_display_type = models.PositiveIntegerField(.....) 
workplace_training_certificationTB = models.CharField(null=False, blank=False) 
workplace_training_certificationTA = models.TextField(null=False, blank=False) 

通常我會掉落max_length=250workplace_training_certificationTBmax_length=5000workplace_training_certificationTA上述模型領域。不過,我相信這必須在forms.py文件中動態完成。

編輯 如果我設置了MAX_LENGTH針對的是workplace_training_certificationTBworkplace_training_certificationTA的車型,因爲這兩個領域具有完全相同的輸入,那麼將觸發服務器端驗證的一個,這就是爲什麼我想動態設置值。

這裏是我的forms.py文件代碼:

def clean(self): 

    cd_wrtdf = super(WorkplaceRelatedTrainingDetailsForm, self).clean() 

    if 'workplace_training_display_type' in cd_wrtdf and cd_wrtdf['workplace_training_display_type'] != 0: 

     # if the workplace_training_display_type is not zero, remove the max_length=250 from the textbox. 

     # if the workplace_training_display_type is not zero, add the max_length=5000 to the textarea. 

    else: 

     # if the workplace_training_display_type is zero, add the max_length=250 to the textbox. 

     # if the workplace_training_display_type is zero, remove the max_length=5000 from the textarea. 

    return cd_wrtdf 

我試圖尋找SO &谷歌,但找不到任何幫助。

+0

爲什麼不在服務器上使兩個字段的長度相同? –

+0

dan-klasson - 因爲如果兩個字段的輸入長度相同並且文本區域有1000個字符,則會觸發文本框的服務器端驗證最大長度(250個字符)。 – user3354539

+0

@ user3354539如果您在模型級別設置max_length,則django會自動驗證您要求的內容 – Alvaro

回答

2

在模型上有重複的字段並不是真正做到這一點的正確方法。您應該將模型更改爲只有一個字段,一個文本字段,最大長度爲5000.然後在forms.py中,您可以使用len(input)檢查輸入的長度。然後您可以根據其他選定字段來決定是否在限制內。

在你乾淨的方法中,調用super()會自動檢查它是否在5000以內,那麼你只需檢查一下它是否需要小於250.如果是,那就看看是否爲if len(input) > 250: raise ValidationError('Too long for type')

+0

electrometro,感謝您的迴應。這讓我看到你的方法有多簡單。我確實必須保留重複的字段,因爲當我嘗試使用'replacewith'替換textbox/textarea時出現問題。它現在可以按我的需要工作。 – user3354539

+0

你應該很容易就能用一些javascript來做到這一點。 – electrometro

1

您的模型字段中不能有動態長度,因爲它們是在數據庫級別上實現的。當您在字段上設置最大長度時,會將其轉換爲等效的SQL,這會限制可以存儲在數據庫級別的數據量。

正如@electrometro提到我也建議在你的模型中的單個CharField它在5000

長度由於這似乎是更多的是用戶界面的問題,你應該這樣做的JavaScript和更換輸入根據你提到的用戶選擇,你需要的類型。只要表單輸入發佈的數據具有相同的名稱,Django表單仍將按預期工作。

您可以執行類似於this toggle behavior的操作,除非您在用戶從列表中選擇一個選項時觸發它。還要確保input/textarea ID和名稱與表單域相同,以便數據能夠通過表單清除。

+0

亞歷克斯卡洛斯,謝謝,你的回覆非常有幫助。 – user3354539