如何在 Django 中正确保存配置文件实例

how to correctly saving a profile instance in django

我在 Django 中创建配置文件实例时遇到问题。当我尝试更新个人资料时,个人资料的图像不会保存在数据库中我的猜测是 form.save(commit=False) 不会上传照片,也不会更新字段,但我没有明白为什么: 这是我的代码:

models.py

class Profile(models.Model):
user         = models.OneToOneField(User, primary_key =True, on_delete=models.CASCADE, related_name= 'profile')
image        = models.OneToOneField(UserImage, on_delete=models.SET_NULL, null=True, blank=True)
phone_number = models.CharField(max_length=50, null = True, blank = True)
followers    = models.ManyToManyField(User, related_name='follower', blank=True)
following    = models.ManyToManyField(User, related_name='following', blank=True)
biography    = models.TextField(max_length=250, null=True, blank=True)

class UserImage(models.Model):
avatar       = models.ImageField(blank=True, null=True,upload_to='avatar_pic')                                  
header_image = models.ImageField(blank=True, null=True,upload_to='header_pic')
                                    
                                    

forms.py

class ProfileForm(ModelForm):
class Meta:
    model = Profile
    fields = (
        'phone_number',
        'biography',
        )

class ImageProfileForm(ModelForm):

class Meta:
    model = UserImage
    fields = (
        'avatar',
        'header_image',
        )

views.py

@login_required
def CompleteSignUp(request):

if request.method == 'POST':
    profile_form = ProfileForm(request.POST,request.FILES ,instance=request.user.profile)
    image_profile_form = ImageProfileForm(request.POST, instance=request.user.profile.image)
    if profile_form.is_valid() and image_profile_form.is_valid():
        profile = profile_form.save(commit=False)
        images  = image_profile_form.save()
        profile.user = request.user
        profile.social = social
        profile.image = images
        profile_form.save()
        return redirect('blog:Home')
else:
    profile_form = ProfileForm(
                                initial={
                                    'phone_number':request.user.profile.phone_number,
                                    'biography':request.user.profile.biography
                                    }
                            )
    if request.user.profile.image:
        image_profile_form = ImageProfileForm(
                                            initial={
                                                'avatar':request.user.profile.image.avatar,
                                                'header_image':request.user.profile.image.header_image
                                            }
                                    )
    else:
        image_profile_form = ImageProfileForm()
    return render(request, 'user/createprofile.html', {'form_p': profile_form, 'form_i': image_profile_form})

模板

{% block content %}
<form method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    <div>
        {{ form_p.biography }}
        biography 
    </div>
    <div>
        {{ form_p.phone_number }}
        phone_number
    </div>
    <div>
        {{ form_i.avatar }}
        avatar
    </div>
    <div>
        {{ form_i.header_image }}
        header
    </div>


 <br>
    <input type="submit" value="Register">
</br>

</form>
    {% for field in form_s %}
        {% for error in field.errors %}
        <p style="color: rgba(255, 0, 0, 0.678)">{{ error }}</p>
        {% endfor %}
    {% endfor %}

{% endblock %}

配置文件已保存,但配置文件的图像没有保存,这是我的错。 ...

变化:

        profile.user = request.user
        profile.social = social
        profile.image = images
        profile_form.save()

收件人:

        profile.user = request.user
        profile.social = social
        profile.image = images
        profile.save() # Use this

您需要保存 profile 而不是带有 commit=False 的表单,因为您对 profile 进行了自定义操作。