33052


Djangoで複数のファイルアップロード処理を行うにあたり、カスタムバリデーションメソッドを共通化したいのですが、方法が分かりません

[code]

    from django import forms
    from django.contrib.staticfiles.templatetags.staticfiles import static
    from django.contrib.admin import widgets
    from django.core.exceptions import ValidationError
    import os
    
    class ContactForm(forms.Form):
        profile_image = forms.Field(
            label='プロフィール画像のアップロード',
            required=False,
            widget = forms.FileInput())
        header_image = forms.Field(
            label='ヘッダー画像のアップロード',
            required=False,
            widget = forms.FileInput())
    
        def clean_profile_image(self):
            profile_image = self.cleaned_data.get('profile_image', False)
            if profile_image:
                valid_extensions = ['.png','.jpg','.gif']
                ext = os.path.splitext(profile_image.name)[1]
                if profile_image._size > 2411724:
                    raise ValidationError("ファイルサイズが大きすぎます(最大2.3MB)")
                elif not ext in valid_extensions:
                    raise ValidationError("許可されていないファイルタイプです")
    
        def clean_header_image(self):
            header_image = self.cleaned_data.get('header_image', False)
            if header_image:
                valid_extensions = ['.png','.jpg','.gif']
                ext = os.path.splitext(header_image.name)[1]
                if header_image._size > 2411724:
                    raise ValidationError("ファイルサイズが大きすぎます(最大2.3MB)")
                elif not ext in valid_extensions:
                    raise ValidationError("許可されていないファイルタイプです")
    
[/code]

上記の通りカスタムバリデーションであるclean_profile_imageとclean_header_imageの処理内容は同一です。こちらを一つにまとめる方法がありましたら、ご教授いただきたく...  
なお、profile_image/header_imageともにrequired=Falseです


CC BY-SA 3.0
2017-03-02T04:33:03.933
33036
2017-03-03T04:02:38.183
2017-03-02T06:35:04.840
19780
19780
question
python django
フォームにおけるカスタムバリデーションメソッドの共通化について


以下のようにしてはどうでしょうか?

[code]

    class ContactForm(forms.Form):
        #...field定義省略...
    
        def clean_profile_image(self):
            self._clean_image('profile_image')
    
        def clean_header_image(self):
            self._clean_image('header_image')
    
        def _clean_image(self, field):
            image = self.cleaned_data.get(field, False)
            if image:
                valid_extensions = ['.png','.jpg','.gif']
                ext = os.path.splitext(image.name)[1]
                if image._size > 2411724:
                    raise ValidationError("ファイルサイズが大きすぎます(最大2.3MB)")
                elif not ext in valid_extensions:
                    raise ValidationError("許可されていないファイルタイプです")
    
[/code]


CC BY-SA 3.0
2017-03-03T00:28:09.720
33052
2017-03-03T04:02:38.183
2017-03-03T04:02:38.183
19780
806
33036
answer