【问题标题】:Django: Uploading Avatar Imagefile to media-Folder of Custom User Profile is not workingDjango:将头像图像文件上传到自定义用户配置文件的媒体文件夹不起作用
【发布时间】: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")

我创建了所需的类 ProfileInlineUserAdmin

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


    【解决方案1】:

    我认为问题出在您的 settings.py 上。 BASE_DIR 显然是你项目的基目录,manage.py 所在的位置。因此,您的媒体文件夹应该在该目录中,否则 Django 将找不到它。我认为您在媒体文件夹中有一个名为avatar 的文件夹。试试:

        import os
    
        BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # You probably already have this
        print(BASE_DIR) # Do this to check if your BASE_DIR is correct
        ...
    
        MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
        MEDIA_URL = '/media/'
    

    【讨论】:

    • 感谢您的回答! :) 我刚刚想通了。我刚刚使用 models.Profile.objects.filter(user=request.user).delete() 删除了数据库中的整个 Profile-Instance 并创建了一个新的。然后它将图像保存在文件夹中..最后。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多