【发布时间】:2020-11-30 15:21:39
【问题描述】:
从本地主机,我可以从 Django 管理员上传用户的图像,但不能从用户应用程序上传。我创建了一个自定义用户,以便我可以使用电子邮件作为用户名(不确定这是否相关)。
我也尝试过设置 AWS_S3_SIGNATURE_VERSION = 's3v4' 但这也不起作用。
与 CustomUser 关联的图像是使用与 CustomUser 模型一对一关联的 Profile 模型添加的。
我很困惑为什么它可以在 Django 管理员中运行,而不是在实际应用程序本身中运行。
任何帮助将不胜感激。我也是 Django 的新手。
以下是相关文件中的sn-ps:
settings.py
AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.environ.get('AWS_STORAGE_BUCKET_NAME')
AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None
AWS_S3_REGION_NAME = 'ap-southeast-2'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
forms.py:
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from django import forms
from .models import CustomUser, Profile
class CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm):
model = CustomUser
fields = ('email',)
class CustomUserChangeForm(UserChangeForm):
class Meta:
model = CustomUser
fields = ('email', 'first_name', 'last_name',)
class ProfileChangeForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['image',]
models.py:
class CustomUser(AbstractUser):
username = None
email = models.EmailField(_('email address'), unique=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = CustomUserManager()
def __str__(self):
return self.email
class Profile(models.Model):
user = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
image = models.ImageField(default='default.jpg', upload_to='profile_pics')
def __str__(self):
return f'{self.user.email} Profile'
views.py:
@login_required
def profile(request):
if request.method == 'POST':
u_form = CustomUserChangeForm(request.POST, instance=request.user)
p_form = ProfileChangeForm(request.POST,
request.FILES,
instance=request.user.profile)
if u_form.is_valid() and p_form.is_valid():
u_form.save()
p_form.save()
messages.success(request, f'Your account has been updated.')
return redirect('profile')
else:
u_form = CustomUserChangeForm(instance=request.user)
p_form = ProfileChangeForm(instance=request.user.profile)
context = {
'u_form': u_form,
'p_form': p_form
}
return render(request, 'users/profile.html', context)
【问题讨论】:
标签: django amazon-s3 image-upload