无法在我的 Django 应用程序中更新用户配置文件 Django



我已经在我的 Django 应用程序中创建了一个编辑配置文件表单,但它没有保存在数据库中。

这是配置文件模型:

class UserProfile(models.Model):
    user = models.OneToOneField(User, related_name='profile', primary_key=True) #Each User is related to only one User Profile
    city_search_text = models.CharField(blank=True, max_length=300)#user picks a city from autocomplete and in the view I get or create a City object
    city = models.ForeignKey(City, blank=True, null=True, related_name='city') #Each User Profile must be related to one city.
    prof_pic = models.ImageField(blank=True, upload_to='profile_pictures')
    dob = models.DateField(blank=True, null=True)
    def __str__(self):
        return self.user.first_name

这是形式:

class EditProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = ('dob',)#I'm testing to update this field only
    def save(self, commit=True):
        profile = super(EditProfileForm, self).save(commit=False)
        if commit:
            profile.save()
        return profile

这是视图:

def editprofile(request):
    if request.method == 'POST':
        edit_profile_form = EditProfileForm(request.POST, instance=request.user)
        if edit_profile_form.is_valid():
            profile = edit_profile_form.save(commit=False)
            profile.save()
            if 'next' in request.GET:
                return redirect(request.GET['next'])
        else:
            print (profile_form.errors)
    else:
        edit_profile_form = EditProfileForm(instance=request.user.profile)
    return render(request, 'excurj/editprofile.html', {'edit_profile_form':edit_profile_form,})

提交表单后,它会将我转发到索引页面,但用户配置文件中的值保持不变。

似乎

if edit_profile_form.is_valid():

根本没有被调用,并且您的数据未保存。这意味着您的表单包含无效数据,您应该检查表单错误以检测这些错误。

此外,如果请求不是 POST,您正在尝试打印表单错误,这毫无意义,也不会帮助您打印表单错误。尝试使用这种方式;

if edit_profile_form.is_valid():
    profile = edit_profile_form.save(commit=False)
    profile.save()
else:
    print (profile_form.errors)

并检查您的表单是否有错误。

我最终想通了。在视图中,我应该传递配置文件的实例而不是用户对象。所以它需要像这样:

edit_profile_form = EditProfileForm(request.POST, instance=request.user.*profile*)

最新更新