首页 > 解决方案 > 如果没有选择图像,则获取用户的旧图像

问题描述

我有一个表单,它接收用户数据,如简历、个人资料图片、性别等,并在提交后创建有关用户的新行或更新现有行。这仅在用户上传图像时才有效。如果没有为个人资料图片上传图片,则不会提交表单。我怎样才能做到这一点,如果用户没有上传个人资料图片,那么它将保留用户以前的个人资料图片并仍然提交?

这是我的代码:

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)

标签: djangodjango-modelsdjango-formsdjango-views

解决方案


我会给你快速和肮脏的 - 3个地方来解决这个问题:

  1. Javascript - 让表单知道需要哪些字段并在用户名已经存在时预先填写(超出您问题的范围,但只是把它扔在那里)
  2. 在 API 端点中(这似乎是您要采用的方法)
  3. 在您的模型中(实现一个自定义保存功能,查看是否新的,并将初始值与后续值进行比较)

我将转储选项 1 和 3,因为它们与您提出的问题无关。我假设用户在每个配置文件中都是唯一的。而且我假设当前需要字段头像。如果您将其设置为不需要,则表单帖子应允许头像为空值 -如何使 django 中的 FileField 为可选?. 您可能在想,但我不希望该字段可能为空白 - 您始终可以强制在第一次发布帖子时通过 API 端点本身设置该字段。如果您将该字段设为可选,则表单将发布,但您可能希望通过实际检查对象是否已存在来更明确地使用 .update_or_create ,如果存在则需要该字段,或者如果不确认该字段已设置。


推荐阅读