2010-01-22 16 views
9
Temiz yönteminde bu gibi şeyler yapıyorum

büyütmekten soru:Django: formlarda temiz() yöntemini geçersiz kılma - hataları

if self.cleaned_data['type'].organized_by != self.cleaned_data['organized_by']: 
     raise forms.ValidationError('The type and organization do not match.') 
if self.cleaned_data['start'] > self.cleaned_data['end']: 
     raise forms.ValidationError('The start date cannot be later than the end date.') 

Ama sonra form yalnızca birini yükseltmek anlamına gelir o Bu hatalar bir anda. Formun bu hataların ikisini birden yükseltmek için bir yolu var mı?

DÜZENLEME 1.: Yukarıdaki için Herhangi çözümler büyük, ama aynı zamanda böyle bir senaryoda çalışacak bir şey isterim: FooAddForm bir ModelForm olduğunu ve belki benzersiz kısıtlamaları vardır

if self.cleaned_data['type'].organized_by != self.cleaned_data['organized_by']: 
     raise forms.ValidationError('The type and organization do not match.') 
if self.cleaned_data['start'] > self.cleaned_data['end']: 
     raise forms.ValidationError('The start date cannot be later than the end date.') 
super(FooAddForm, self).clean() 

ayrıca hatalara neden olur. Herkes böyle bir şey biliyorsa, o Dokümanlar

cevap

17

... çok iyi olurdu:

https://docs.djangoproject.com/en/1.7/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other

from django.forms.util import ErrorList 

def clean(self): 

    if self.cleaned_data['type'].organized_by != self.cleaned_data['organized_by']: 
    msg = 'The type and organization do not match.' 
    self._errors['type'] = ErrorList([msg]) 
    del self.cleaned_data['type'] 

    if self.cleaned_data['start'] > self.cleaned_data['end']: 
    msg = 'The start date cannot be later than the end date.' 
    self._errors['start'] = ErrorList([msg]) 
    del self.cleaned_data['start'] 

    return self.cleaned_data 
+0

Bu çok güzel çalışıyor (hata iletilerinin tüm form yerine alanlara eklendiğinden hoşlandığımı emin değildim ama aslında Bu şekilde daha mantıklı geliyor) ve ModelForm benzersiz kısıtlamaları da işe yarıyor. Ben de bunu kabul ediyorum - teşekkürler! :) –

7
errors = [] 
if self.cleaned_data['type'].organized_by != self.cleaned_data['organized_by']: 
     errors.append('The type and organization do not match.') 
if self.cleaned_data['start'] > self.cleaned_data['end']: 
    errors.append('The start date cannot be later than the end date.') 

if errors: 
    raise forms.ValidationError(errors) 
+0

Grrr .... bu + 1'i vermeye çalışıyordu, ama ben yanlışlıkla iki kez tıkladı ve şimdi "oylanacak kadar eski oy" grrr ... Neyse, güzel cevap :) ama hala yaşıyorum bununla ilgili bir problem ... Benzersiz kısıtlamaları kontrol etmenin önemli olduğu bir ModelForm'da temiz bir yöntemim var, ancak eğer hata yaparsam: hatalar: forms.ValidationError (errors) super (CompetitionAddForm, self). clean() o zaman benim hatalarım ya da benzersiz kısıtlama hataları: -/ –

3

Eğer hata iletileri eklenebilir tercih ederseniz belirli alanlardan ziyade, bu tür "__all__" anahtarını şu şekilde kullanabilirsiniz:

Ayrıca, Django belgelerinin açıkladığı gibi: "Belirli bir alana yeni bir hata eklemek istiyorsanız, anahtarın self._errors numaralı telefondan mı yoksa mevcut olup olmadığını kontrol etmelisiniz. Değilse, boş bir ErrorList örneğini tutarak, verilen anahtar için yeni bir giriş oluşturun. Her iki durumda da, hata mesajını söz konusu alan adı için listeye ekleyebilir ve form görüntülendiğinde görüntülenir. "

3

Eski postası olmasına rağmen, daha az kod istiyorsanız add_error() kullanabilirsiniz. . hata iletileri eklemek için yöntem kullandığım durumda göstermek için @ Kemar cevabını uzanan ediyorum. otomatikman cleaned_data sözlükten alanını kaldırır

add_error()

, bunu elle silmek zorunda değilsin Ayrıca kullanmak şey ithal etmek zorunda değilsin Bu

documentation is here

def clean(self): 

    if self.cleaned_data['type'].organized_by != self.cleaned_data['organized_by']: 
    msg = 'The type and organization do not match.' 
    self.add_error('type', msg) 

    if self.cleaned_data['start'] > self.cleaned_data['end']: 
    msg = 'The start date cannot be later than the end date.' 
    self.add_error('start', msg) 

    return self.cleaned_data