我已经在我的 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*)