In a form I have certain fields, that are not validated correctly. I wish to override the django validation and put my own instead. When I override the clean() method, the field self.errors is already filled with errors from the wrongly validated fields. Which method should I override, where are these errors generated?
With overriding clean() and similar methods, one can achieve only extension to the django default validation. I want to prevent this default validation from happening.
Edit: tried validators
Here is what I tried:
253   def validate_gallery(value):
254     print 'validate galley'
255     return True
256   
257   def validate_cover_photo(value):
258     print 'validate_cf'
259     return True
260 
261   cover_photo_widget = SelectWithDefaultOptions(attrs={
262       'class': 'chosen-select-no-single',
263       'id': 'select-cover-photo',
264       'data-placeholder': 'Select Cover Photo',
265       'style': 'width: 200px;',
266       'tabindex': '-1',
267     });
268 
269   gallery_widget = SelectWithDefaultOptions(attrs={
270       'class': 'chosen-select-no-single',
271       'id': 'select-galley',
272       'data-placeholder': 'Select Gallery',
273       'style': 'width: 200px;',
274       'gallery-select': '',
275       'tabindex': '-1',
276       'organisator-profile-specific': '',
277     });
278   
279   gallery = forms.ChoiceField(widget = gallery_widget, validators = [validate_gallery])
280   cover_photo = forms.ChoiceField(widget = cover_photo_widget, validators = [validate_cover_photo])
Those validators are not even called. Seems like the error-seeking process ends at the validate() function call, which happens before any validators are called.
Edit: posting the whole class
240 def validate_gallery(value):
241   print 'validate galley'
242   return True
243 
244 def validate_cover_photo(value):
245   print 'validate_cf'
246   return True
247 
248 class EventDetailForm(NgFormValidationMixin, NgModelForm):
249   def __init__(self, *args, **kwargs):
250     super(EventDetailForm, self).__init__(*args, **kwargs)
251     self.fields['end_date'].required = False
252     self.fields['description'].required = False
253     self.fields['start_date'].input_formats = DATE_TIME_INPUT_FORMATS
254     self.fields['end_date'].input_formats = DATE_TIME_INPUT_FORMATS
255 
256     arguments_length = len(args)
257     if arguments_length > 0:
258       post_data = args[0]
259       self.old_title = post_data.get('old_title', None)
260 
261   cover_photo_widget = SelectWithDefaultOptions(attrs={
262       'class': 'chosen-select-no-single',
263       'id': 'select-cover-photo',
264       'data-placeholder': 'Select Cover Photo',
265       'style': 'width: 200px;',
266       'tabindex': '-1',
267     });
268 
269   gallery_widget = SelectWithDefaultOptions(attrs={
270       'class': 'chosen-select-no-single',
271       'id': 'select-galley',
272       'data-placeholder': 'Select Gallery',
273       'style': 'width: 200px;',
274       'gallery-select': '',
275       'tabindex': '-1',
276       'organisator-profile-specific': '',
277     });
278 
279   gallery = forms.ChoiceField(widget = gallery_widget, validators = [validate_gallery])
280   cover_photo = forms.ChoiceField(widget = cover_photo_widget, validators = [validate_cover_photo])
281 
282   class Meta:
283     model = Event
284     fields = ('title', 'description', 'end_date', 'start_date')
285     widgets = {
286       'title': forms.TextInput(attrs={
287         'editable-detail': '',
288       }),
289       'description': forms.TextInput(attrs={
290         'class': 'panel-body',
291         'id': 'event-description-editable',
292         'editable-detail': '',
293       }),
294       'start_date': DateTimeWidget(attrs = {
295         'class': 'datetimepicker col-xs-6',
296         'id': 'event-start-date-editable',
297         'editable-detail': '',
298       }),
299       'end_date': DateTimeWidget(attrs = {
300         'class': 'datetimepicker col-xs-6',
301         'id': 'event-end-date-editable',
302         'editable-detail': '',
303       }),
304     }
305 
306   def clean(self):
307     cleaned_data = self.cleaned_data
308 
309     print self.errors
310 
311     return cleaned_data
312     
313   def save(self, commit=True):
314     old_title = self.old_title
315     event = Event()
316 
317     cover_photo_title = self.cleaned_data['cover_photo']
318     cover_photo = Photo.objects.filter(title=cover_photo_title)
319     
320     gallery_title = self.cleaned_data['gallery']
321     gallery = Gallery.objects.filter(title=gallery_title)
322 
323     event.title = self.cleaned_data['title']
324     event.description = self.cleaned_data['desription']
325     event.start_date = self.cleaned_date['start_date']
326     event.end_date = self.cleaned_data['end_date']
327     event.cover_photo = cover_photo
328     event.gallery = gallery
329 
330     if commit:
331       event.save()
332       
333     return event
334 
In clean() I can see that the errors are there, save() is never executed.
Why not write your own Field class, that has its own validate method, as this is called before the validator itself:
class MyCustomChoiceField(ChoiceField):
    def validate(self, value):
        <do something to validate your field>
then use it:
gallery = MyCustomChoiceField(widget = gallery_widget)
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With