如果未选择任何图像,则获取用户的旧图像

时间:2019-01-29 01:38:07

标签: django django-models django-forms django-views

我有一个表单,可以接收诸如个人简介,个人资料图片,性别等用户数据,提交后要么创建有关用户的新行,要么更新现有行。仅当用户上传图像时,这才起作用。如果没有上传个人资料图片的图像,则不提交表单。我该如何做到这一点,以便如果用户未上传个人资料图片,那么它将保留用户先前的个人资料图片并仍然提交?

这是我的代码:

class ProfileSettings(UpdateView):
    model = Profile
    template_name = 'blog/settings.html'
    form_class = ProfileForm
    success_url = reverse_lazy('blog:settings')

    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST, request.FILES)

        if form.is_valid():
            bio = form.cleaned_data['bio']
            gender = form.cleaned_data['gender']
            avatar = form.cleaned_data['avatar']

            Profile.objects.update_or_create(user=self.request.user, defaults={'avatar':avatar, 'bio':bio, 'gender':gender})

        return HttpResponseRedirect(self.success_url)

1 个答案:

答案 0 :(得分:0)

我给你快速又肮脏的3个解决方法:

  1. JavaScript-使表单知道所需的字段,并在用户名已经存在的情况下进行预填充(超出您的问题范围,只是将其扔在那里)
  2. 在API端点中(这似乎是您要使用的方法)
  3. 在模型中(实现一个自定义保存功能,以查看是否为新功能,并将初始值与后续值进行比较)

我将转储选项1和3,因为它们与您所问的问题无关。我假设每个配置文件的用户都是唯一的。我假设当前需要字段化身。如果将其设置为不需要,则表单发布应允许化身为空值-How to make FileField in django optional?。您可能在想,但我不希望该字段为空-您始终可以强制要求,第一次发布该字段是通过API端点本身设置的。如果您将该字段设置为可选,则该表单将发布,但您可能希望通过.update_or_create来更明确地显示它,方法是实际检查该对象是否已经存在,是否需要该字段,或者是否确认已设置该字段。