2017-10-17 1 views
1

Ich habe benutzerdefinierte clean_* Formularmethode, die hochgeladene Bildtyp und Dateierweiterung überprüft.Ändern der Standard-Feld-Validierung in Django ModelForm

class TableModelForm(ModelForm): 
    def clean_image(self): 
     img_err = 'Unsupport image type. Please upload png, jpg or gif.' 
     img_formats = ['png', 'jpeg', 'gif'] 
     img = self.cleaned_data.get('image') 
     if not img: 
      return img 
     img_fmt = img.image.format.lower() 
     img_ext = splitext(img.name)[1][1:].lower() 
     if any([x not in img_formats for x in [img_fmt, img_ext]]): 
      raise ValidationError(ugettext_lazy(img_err), code='invalid_image') 
     return img 

Es funktioniert gut, bis das Bild des entsprechenden Format, aber ohne eine Dateierweiterung versucht wird, in welchem ​​Fall default_validator Kicks und ich sehe die Standard FileExtensionValidator Fehlermeldung zu laden,:

File extension '' is not allowed. Allowed extensions are: 'bmp, bufr, cur, pcx, dcx, dds, ps, eps, fit, fits, fli, flc, fpx, ftc, ftu, gbr, gif, grib, h5, hdf, png, jp2, j2k, jpc, jpf, jpx, j2c, icns, ico, im, iim, tif, tiff, jfif, jpe, jpg, jpeg, mic, mpg, mpeg, mpo, msp, palm, pcd, pdf, pxr, pbm, pgm, ppm, psd, bw, rgb, rgba, sgi, ras, tga, webp, wmf, emf, xbm, xpm'. 

Ist gibt es eine Möglichkeit, das default_validator des ModelForm Feldes zu ersetzen, ohne das Feld erneut zu deklarieren?

+0

Welche Version von Django verwenden Sie? Du kannst [ticket # 28242] (https://code.djangoproject.com/ticket/28242) finden, was in Django 1.11.2 relevant ist. – Alasdair

+0

Danke, ich benutze '(1, 11, 4, 'final', 0)', aber nicht sicher, wie das referenzierte Häkchen mir helfen könnte? –

Antwort

1

Ich würde versuchen, das Feld validators auf eine leere Liste in der Form __init__ Methode des Formulars.

class TableModelForm(ModelForm): 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     self.fields['image'].validators = [] 

könnte eine weitere Option ImageField Unterklasse und default_validators ändern, dann in der Modellform benutzen, um Ihr benutzerdefiniertes Feld.

Ich bin nicht wirklich vertraut mit den Interna des Dateifeldes und Bildfeld, so dass ich nicht sicher bin, ob einer der beiden Ansätze funktioniert.