django 更新头像的问题,源码看了几遍了也不知道哪里出的问题。

发布于 2022-09-04 07:50:37 字数 1421 浏览 20 评论 0

我有一个用户模型:

class User(AbstractUser):
    mugshot = models.ImageField(upload_to=user_mugshot_path)

    def save(self, *args, **kwargs):
        if not self.mugshot:
            avatar = Avatar(rows=10, columns=10)
            image_byte_array = avatar.get_image(string=self.username,
                                                width=480,
                                                height=480,
                                                pad=10)
            self.mugshot.save('default_mugshot.png', ContentFile(image_byte_array), save=False)
        super().save(*args, **kwargs)

其作用是如果用户没有指定头像,就会为其创建一个默认的头像。现在用户要上传他自己的头像,这是表单和视图的代码:

class MugshotForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('mugshot',)

class MugshotChangeView(LoginRequiredMixin, UpdateView):
    form_class = MugshotForm
    template_name = 'users/mugshot_change.html'
    success_url = '/users/profile'

    def form_valid(self, form):
        if form.has_changed():
            self.object.mugshot.delete(save=False)
        return super().form_valid(form)

    # TODO: Can't update mugshot correctly
    def get_object(self, queryset=None):
        return self.request.user

在视图中,我检测到如果用户上传了新头像,那么就首先删除旧的头像,然后再保存新的头像,这是预期行为。但是代码实际的运行结果是如果用户上传了新头像,那么旧头像会被删除,模型保存时会认为用户没有头像,从而又为其创建一个新的默认头像,而用户自身上传的头像没有被关联。看了几遍视图函数的源代码,依然找不出问题所在,求助攻!!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

眉黛浅 2022-09-11 07:50:37

问题解决了,需要让 get_object 获得新的模型实例。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文