首页 > 解决方案 > Django 在其他字段中形成所有更改,除了图像字段正在工作

问题描述

图像更改在 django admin 中起作用,但是当我尝试在 html 表单中更改相同时,除了图像字段之外的所有其他更改都被反映。

视图.py

def edit_profile(request):
    if request.method == 'POST':
        form = EditProfileForm(request.POST, instance=request.user.userprofile)

        if form.is_valid():
            form.save()
            return redirect('view_profile')
    else:
        form = EditProfileForm(instance=request.user.userprofile)
        args = {'form': form}
        return render(request, 'post/update_profile.html', args)

update_profile.html

{% extends "post/header.html"%}
{% block content %}

<div class="container">
    <form method="post" enctype='multipart/form-data'>
        {% csrf_token %}
        <p >Bio:    {{ form.bio }}</p>
        <p> Phone    {{ form.phone }}</p>
        <p> Website : {{ form.website }} </p>
        <p> Image :  {{ form.image }}</p>
        <button type="submit">Submit</button>
    </form>
    <br>
</div>
{% endblock content %}

表格.py

class EditProfileForm(UserChangeForm):
     class Meta:
        model = UserProfile
        fields = (
            'bio',
            'phone',
            'website',
            'image',
        )

模型.py

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

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

def create_profile(sender, **kwargs):
    if kwargs['created']:
        user_profile = UserProfile.objects.create(user=kwargs['instance'])
post_save.connect(create_profile, sender=User)

标签: djangodjango-formsdjango-templatesdjango-viewsdjango-admin

解决方案


视图.py

由于您正在尝试存储文件,因此在请求中您还需要提供request.FILES

def edit_profile(request):
        if request.method == 'POST':
            form = EditProfileForm(request.POST,request.FILES, instance=request.user.userprofile)

            if form.is_valid():
                form.save()
                return redirect('view_profile')
        else:
            form = EditProfileForm(instance=request.user.userprofile)
            args = {'form': form}
            return render(request, 'post/update_profile.html', args)

推荐阅读