2010-01-22 28 views
9

Tôi đã làm những việc như thế này trong các phương pháp làm sạch:Django: Trọng() phương pháp sạch trong các hình thức - câu hỏi về nâng lỗi

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.') 

Nhưng sau đó có nghĩa rằng hình thức chỉ có thể huy động một trong những lỗi này tại một thời điểm. Có cách nào để biểu mẫu tăng cả hai lỗi này?

EDIT # 1: Bất kỳ giải pháp cho ở trên là rất lớn, nhưng rất thích cái gì đó cũng sẽ làm việc trong một kịch bản như:

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() 

đâu FooAddForm là một ModelForm và có ràng buộc duy nhất mà có thể cũng gây ra lỗi. Nếu có ai biết của một cái gì đó như thế, đó sẽ là tuyệt vời ...

Trả lời

17

Từ các tài liệu:

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

Điều này hoạt động rất độc đáo (Tôi không chắc chắn nếu tôi thích các thông báo lỗi được đính kèm vào các trường chứ không phải toàn bộ biểu mẫu, nhưng nó thực sự là loại có ý nghĩa hơn theo cách này) và các ràng buộc duy nhất của ModelForm cũng hoạt động. Vì vậy, tôi chấp nhận điều này - cảm ơn! :) –

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 .... đang cố gắng đưa ra +1 này, nhưng tôi vô tình nhấn hai lần và bây giờ nói "bỏ phiếu quá cũ để được thay đổi" grrr ... Dù sao, câu trả lời hay :) nhưng tôi vẫn đang có một vấn đề với nó ... Tôi đã có một phương pháp sạch trên một ModelForm, nơi nó quan trọng để kiểm tra các ràng buộc duy nhất, nhưng nếu tôi làm: nếu lỗi: tăng forms.ValidationError (lỗi) super (CompetitionAddForm, self). clean() sau đó là lỗi của tôi hoặc các lỗi ràng buộc duy nhất: -/ –

3

Nếu bạn muốn rằng các thông báo lỗi được gắn vào biểu mẫu thay vì các trường cụ thể, bạn có thể sử dụng khóa "__all__" như sau:

msg = 'The type and organization do not match.' 
self._errors['__all__'] = ErrorList([msg]) 

Ngoài ra, như tài liệu Django giải thích: "nếu bạn muốn thêm lỗi mới vào một trường cụ thể, bạn nên kiểm tra xem khóa đã tồn tại trong self._errors hay chưa. Nếu không, hãy tạo mục nhập mới cho khóa đã cho, giữ một phiên bản trống ErrorList. Trong cả hai trường hợp, bạn có thể thêm thông báo lỗi của mình vào danh sách cho tên trường được đề cập và danh sách sẽ được hiển thị khi biểu mẫu được hiển thị. "

3

Mặc dù bài đăng cũ của nó, nếu bạn muốn ít mã hơn bạn có thể sử dụng add_error() phương pháp để thêm thông báo lỗi Tôi đang mở rộng câu trả lời của @ kemar để hiển thị trường hợp đã sử dụng:

add_error() tự động xóa trường khỏi từ điển clean_data, bạn không phải xóa nó theo cách thủ công. này

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 
Các vấn đề liên quan