【发布时间】:2022-01-18 14:58:53
【问题描述】:
我目前正在尝试创建一个自定义用户模型,以便能够向用户添加 Avatar-Imagefield。
因此,我创建了一个模型 Profile,其中头像作为所有图像的目录 (media/avatars/):
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
avatar = models.ImageField('Avatar', upload_to="avatars", default="avatars/profil_picture_icon.png")
我创建了所需的类 ProfileInline 和 UserAdmin:
class ProfileInline(admin.StackedInline):
model = Profile
can_delete = False
class UserAdmin(BaseUserAdmin):
inlines = (ProfileInline,)
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
我还在设置中定义了媒体目录:
MEDIA_ROOT = BASE_DIR / 'media'
MEDIA_URL = '/media/'
之后,我创建了一个表单 ProfileForm,用户可以在其中上传图片和一个 postsavereceiver,以在我每次创建基本 Profile-Model 时创建一个新用户:
class ProfileForm(forms.ModelForm):
class Meta:
model = models.Profile
exclude = ('user',)
def post_save_receiver(sender, instance, created, **kwargs):
if created:
user_profile = models.Profile(user=instance)
user_profile.save()
post_save.connect(post_save_receiver, sender=settings.AUTH_USER_MODEL)
在我的模板中,然后我创建了一个带有 Avatar-ImageField 和一个保存按钮的表单来上传该图像:
<form action="/profil/" method="post" id="avatar_form">
{% csrf_token %}
<img style="border-radius: 100px" id= "Profil_Image" src=" {{ user.profile.avatar.url }}">
{% load widget_tweaks %}
{{ profile_form.avatar|add_class:"profile_form" }}
<button id="update_button" style="left: 1210px; top: 385px" type="submit" form="avatar_form" name="avatar_update_btn" value="">Speichern</button>
</form>
最后在我的 views.py 中,用户可以更新默认图像
elif 'avatar_update_btn' in request.POST:
profile_form = ProfileForm(request.POST, request.FILES)
models.Profile.objects.filter(user=request.user).update(avatar="avatars/" + profile_form.data['avatar'])
-> 问题来了。
它正在使用正确的文件名更新数据库中的 Avatar-URL,但在重新加载页面后找不到图像,因为图像没有上传到 media/avatars/-文件夹中,我不知道为什么。
只要我将图像保存在管理页面上,它就可以正常工作,并且会在头像文件夹中创建一个新的图像实例。但是,一旦我尝试使用 ImageField 上传它,它就不会在文件夹中创建新的图像实例。
我认为它必须与模型的“更新”功能有关。也许使用“更新”它只是在不创建新图像实例的情况下更改 URL,这就是我尝试使用 profile_form.save() 函数上传它的原因。但它不会让我保存它,因为 save() 函数想要创建一个新的 Model-Instance 但 Profile-Model 已经存在。
你能帮帮我吗?
在此先感谢您。
【问题讨论】:
标签: django django-models avatar