V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yangxg
V2EX  ›  Django

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

  •  
  •   yangxg · 2016-12-16 17:34:21 +08:00 · 2577 次点击
    这是一个创建于 2897 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我有一个用户模型:

    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
    

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

    zmrenwu
        1
    zmrenwu  
       2016-12-16 17:35:57 +08:00
    看代码没有看出什么问题!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2859 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 14:54 · PVG 22:54 · LAX 06:54 · JFK 09:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.