【问题标题】:How can I upload profile picture in user extended model in Django如何在 Django 的用户扩展模型中上传个人资料图片
【发布时间】:2020-09-22 18:35:40
【问题描述】:

在将封面图片上传到 Django 的用户扩展模型时,我没有收到任何错误,但我看不出我在做什么,因为它没有给出任何错误,甚至没有更新我的模型。但是我可以通过使用这个概念来更改简历,但我无法将封面图像更新为我的用户扩展模型。 这里我给出源代码

models.py

class Memer(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    mobile = models.CharField(max_length=16, blank=True, null=True)
    bio = models.CharField(max_length=150, blank=False, null=False, default="Hey! I'm new here.")
    cover = models.ImageField(upload_to='cover-images/%y/%m/%d/', default='cover-images/default/memerrank-bg.jpg', blank=False, null=False)
    profile = models.ImageField(upload_to='profile-images/%y/%m/%d/', default='profile-images/default/memerrank-no-dp.jpg', blank=False, null=False)
    def __str__(self):
        return str(self.user)

forms.py

class UpdateCoverImageForm(forms.ModelForm):
    class Meta:
        model = Memer
        fields = ['cover']

views.py

def profile(request, username):
    try:
        user = User.objects.get(username=username)
        user_ = User.objects.filter(username=username)
        memer = Memer.objects.filter(user=user_[0].id)
    except User.DoesNotExist:
        raise Http404("Memer does not exist.")

    context = {
        'user_': user_,
        'memer': memer,
    }
    if request.method == "POST":
        bioForm = EditBioForm(data=request.POST, instance=request.user.memer)
        coverImageForm = UpdateCoverImageForm(data=request.FILES, instance=request.user.memer)
        if bioForm.is_valid():
            memer_ = bioForm.save(commit=False)
            memer_.save()
            messages.success(request, "Bio successfully updated your profile")
            return redirect('/profile/'+user_[0].username)
        elif coverImageForm.is_valid():
            memer_ = coverImageForm.save(commit=False)
            memer_.save()
            messages.success(request, "Cover Image has been updated successfully!")
            # print(coverImageForm)
            return redirect('/profile/'+user_[0].username)
        else:
            messages.error(request, "Something wrong happend")
            return redirect('/profile/'+user_[0].username)
    return render(request, 'profile.html', context)

profile.html

<form method="post" enctype="multipart/form-data">
 {% csrf_token %}
 {{ UpdateCoverImageForm }}
 <input type="submit" value="save">
</form>

【问题讨论】:

  • docs.djangoproject.com/en/3.1/topics/http/file-uploads 您缺少请求。表单中的文件
  • @iklinac 你能否详细说明我应该添加到我的代码中的内容以及为什么?提前致谢。
  • EditBioForm(data=request.POST, request.FILES, instance=request.user.memer)
  • 无论如何强烈建议您阅读 Django 文档的那部分
  • @DmitryBelaventsev 但是我可以更改我的用户扩展模型的生物字段,但封面并没有改变,但是当我尝试从管理面板更改它时它会改变。等等,让我添加我的模型。

标签: python python-3.x django django-models django-forms


【解决方案1】:

所以我经历了很多可能性,找到了https://stackoverflow.com/users/764182/dmitry-belaventsev帮助我的这个问题的答案。

所以,这里的问题出在views.py

1.ModelForm构造函数中的前两个位置参数是数据和文件。您应该将data 传递给第一个,将files 传递给第二个。

2.如果此处没有文件字段,则不要进行任何更改

bioForm = EditBioForm(data=request.POST, instance=request.user.memer)

3.但是在这里进行更改

coverImageForm = UpdateCoverImageForm(data=request.FILES, instance=request.user.memer)

coverImageForm = UpdateCoverImageForm(request.POST, request.FILES, instance=request.user.memer)

Boom 你的文件会得到更新。

【讨论】:

    【解决方案2】:

    您不会仅仅因为代码完全按照您的指示执行任何错误。代码永远不会进入 elif 语句,这是因为“if bioForm.is_valid():”语句将始终返回 True。我建议你做这样的事情

    if request.method == "POST":
            bioForm = EditBioForm(data=request.POST, instance=request.user.memer)
            coverImageForm = UpdateCoverImageForm(data=request.FILES, instance=request.user.memer)
            if bioForm.is_valid() and coverImageForm.is_valid():
                memer_ = bioForm.save(commit=False)
                memer_ = coverImageForm.save(commit=False)
                memer_.save()
                memer_.save()
                messages.success(request, "Profile successfully updated your profile")
                return redirect('/profile/'+user_[0].username)
            else:
                messages.error(request, "Something wrong happend")
                return redirect('/profile/'+user_[0].username)
        return render(request, 'profile.html', context)
    

    如果您希望一次更新一个字段,那么我建议您为每个字段创建不同的视图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-10
      • 1970-01-01
      • 2014-10-05
      • 2013-09-06
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多