我有一个用户模型:
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
在视图中,我检测到如果用户上传了新头像,那么就首先删除旧的头像,然后再保存新的头像,这是预期行为。但是代码实际的运行结果是如果用户上传了新头像,那么旧头像会被删除,模型保存时会认为用户没有头像,从而又为其创建一个新的默认头像,而用户自身上传的头像没有被关联。看了几遍视图函数的源代码,依然找不出问题所在,求助攻!!
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.