3

私は、django 登録と django プロファイルの両方を使用するプロジェクトに取り組んでいます。写真のアップロードを含む、ユーザーがプロファイルを編集/作成できるフォームがあります。次の状況では、すべてが正常に機能します。プロファイルが作成または編集され、画像がアップロードされたことはありません。プロフィールが編集/作成され、画像がアップロードされます。画像がアップロードされると、以前にアップロードされた画像が変更または削除されている限り、プロファイルを編集できます...問題が発生するのは、既存のプロファイル画像があり、ユーザーが自分の画像を編集しようとした場合です。 /現在の画像に変更を加えずに (つまり、削除または置換して) 彼女のプロファイルを削除します。その状況では、「ImageFieldFile」オブジェクトに属性「content_type」がありませんというエラーが表示されます。なぜこれが起こっているのかについてのアイデア。スタックオーバーフローで見つかった他の回答のバリエーションを試しましたが、記載されているとおりに機能させることができませんでした。私が現在持っているのは、私が行った変更を加えたものの1つのバリエーションです。

class UserProfileForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(UserProfileForm, self).__init__(*args, **kwargs)
        try:
            self.fields['email'].initial = self.instance.user.email
        except User.DoesNotExist:
            pass

    email = forms.EmailField(label="Primary email", help_text='')

    class Meta:
        model = UserAccountProfile
            exclude = ('user', 'broadcaster', 'type')
            widgets = {
            ...
        }


    def save(self, *args, **kwargs):
        u = self.instance.user
        u.email = self.cleaned_data['email']
        u.save()
        profile = super(UserProfileForm, self).save(*args,**kwargs)
        return profile

    def clean_avatar(self):
        avatar = self.cleaned_data['avatar']            

        if avatar:
            w, h = get_image_dimensions(avatar)
            max_width = max_height = 500
            if w >= max_width or h >= max_height:
                raise forms.ValidationError(u'Please use an image that is %s x %s pixels or less.' % (max_width, max_height))

            main, sub = avatar.content_type.split('/')
            if not (main == 'image' and sub in ['jpeg', 'pjpeg', 'gif', 'png']):
                raise forms.ValidationError(u'Please use a JPEG, GIF or PNG image.')

            if len(avatar) > (50 * 1024):
                raise forms.ValidationError(u'Avatar file size may not exceed 50k.')

        else:
            pass

        return avatar

助けやアドバイスをありがとう。

完全なトレースバックは次のとおりです。

Traceback:
File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "C:\Python27\lib\site-packages\django\contrib\auth\decorators.py" in _wrapped_view
  20.                 return view_func(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\profiles\views.py" in edit_profile
  197.         if form.is_valid():
File "C:\Python27\lib\site-packages\django\forms\forms.py" in is_valid
  124.         return self.is_bound and not bool(self.errors)
File "C:\Python27\lib\site-packages\django\forms\forms.py" in _get_errors
  115.             self.full_clean()
File "C:\Python27\lib\site-packages\django\forms\forms.py" in full_clean
  270.         self._clean_fields()
File "C:\Python27\lib\site-packages\django\forms\forms.py" in _clean_fields
  290.                     value = getattr(self, 'clean_%s' % name)()
File "C:\Documents and Settings\user\projects\xlftv\lftv\userprofiles\forms.py" in clean_avatar
  146.          main, sub = avatar.content_type.split('/')

Exception Type: AttributeError at /instructor_profiles/edit
Exception Value: 'ImageFieldFile' object has no attribute 'content_type'
4

2 に答える 2

0

したがって、トレースバックの最後のポイントを見ると、エラーがこの行から発生していることがわかります。これは、メソッドmain, sub = avatar.content_type.split('/')から発生しているように見えますclean_avatar。あなたはそれが画像であることを確認しようとしているようです...私はそれを行う別の方法があると想像しなければなりません。

avatar.name最悪の場合のように見えますが、ファイル拡張子を確認するために解析できるはずです( https://docs.djangoproject.com/en/dev/ref/files/file/#django.core.files.Fileを参照)

ところで、content_typeインスタンスを取得する方法はですContentType.get_for_model(avatar)

于 2012-10-08T16:53:05.583 に答える