Form.save (commit = False) si comportano in modo diverso in Django 1.2.3?
-
04-10-2019 - |
Domanda
Prima di oggi, ho usato Django 1.1. Per garantire Sto stare al passo con i tempi, ho deciso di aggiornare il mio ambiente di Django Django utilizzare 1.2.3. Purtroppo, ho incontrato un problema.
Il codice seguente non ha sollevato un ValueError in 1.1:
instance = FormClass(
request.POST,
instance=existing_instance
).save(commit=False)
Tuttavia, ora che ho aggiornato, solleva un ValueError ogni volta. Ho un campo SSN che sto presentando come parte della mia forma e togliere i trattini prima di fare una) chiamata (instance.save. Purtroppo, il ValueError verifica perché Django pensa che il mio valore SSN è troppo lungo (si aspetta 9 caratteri ed è la ricezione di 11 - 123-45-6789)
.Ho guardato attraverso la documentazione Django e non riuscivo a trovare qualsiasi cosa relativa a questo cambiamento. Qualche idea di cosa sta succedendo? Ho sempre pensato che lo scopo del parametro "commit = False" è stato quello di consentire la pre-elaborazione dei dati prima di salvare le informazioni.
mi sto perdendo qualcosa?
Soluzione
Secondo le 1.2 Docs del save()
metodo , "Se si chiama save () con commit = false, allora verrà restituito un oggetto che non è ancora stato salvato nel database." Quindi io non sono sicuro perché ci sarebbe stato un cambiamento in termini di funzionalità, ma è possibile che in 1.1 validazione / codice di controllo ha funzionato solo quando un oggetto è stato salvato nel database, e in 1,2 succede in precedenza (prima che l'oggetto viene salvato) .
In ogni caso, se siete i dati di pulizia che viene immesso in una forma, si dovrebbe probabilmente essere la pulizia nel FormClass:
def clean_ssn(self):
data = re.sub(r'[^0-9]','',self.cleaned_data['ssn'])
#validation code here
return data
Questo dovrebbe almeno risolvere il problema ...