django - 图像不是保存,所有其他字段都是

时间:2017-07-11 14:49:59

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

当我通过视图更新用户配置文件时,除图像外,所有内容都保存到数据库。表单正在验证,但图像未被保存。我可以登录管理门户并成功将图像添加到现有实例。我认为我的问题在于我的html模板,但我无法弄清楚它是什么。

**顺便说一下,我读了多篇类似的帖子,但我认为没有解决我的问题。

form.py

class EditUserForm(forms.ModelForm):
    template_name='/something/else'

    class Meta:
        model = User
        fields = (
            'email',
            'first_name',
            'last_name',
        )

class EditProfileForm(forms.ModelForm):
    template_name='/something/else'

    class Meta:
        model = UserProfile
        fields = (
            'description',
            'city',
            'website',
            'phone',
            'image',

    )

views.py

@transaction.atomic
def edit_profile(request):
    if request.method == 'POST':
        form = EditUserForm(request.POST, instance=request.user)
        form2 = EditProfileForm(request.POST, instance=request.user.userprofile)
        if form.is_valid() and form2.is_valid():
            form.save()
            form2.save()
            return redirect(reverse('accounts:view_profile'))
    else:
        form = EditUserForm(instance=request.user)
        form2 = EditProfileForm(instance=request.user.userprofile)
        args = {'form': form, 'form2':form2}
        return render(request, 'accounts/edit_profile.html', args)

models.py

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    description = models.CharField(max_length=100, default='')
    city = models.CharField(max_length=100, default='')
    website = models.URLField(default='')
    phone = models.IntegerField(default=0)
    image = models.ImageField(upload_to='profile_image', blank=True)


    def __str__(self):
        return self.user.username

edit_profile.html

<div class="container">

  {% if form.errors %}
    <ol>
      {% for field in form %}
        <H3 class="title">
        <p class="error"> {% if field.errors %}<li>{{ field.errors|striptags }}</li>{% endif %}</p>
        </H3>
      {% endfor %}
    </ol>
  {% endif %}

    <form method="post" enctype="multipart/form-data">
        {% csrf_token %}
        {{ form.as_p }}
        {{ form2.as_p }}
        <button type="submit">Submit</button>
    </form>
    <br>
</div>

1 个答案:

答案 0 :(得分:3)

如果您要上传文件,则必须使用request.POSTrequest.FILES来实例化表单。

form2 = EditProfileForm(request.POST, request.FILES, instance=request.user.userprofile)

有关详细信息,请参阅file uploads上的文档。