我看到了另一个答案here以及网络上其他推荐在扩展内置django用户时使用user.get_profile的地方。我在下面的例子中没有这样做。功能似乎工作正常,但不使用user.get_profile()有不利之处吗?
class UserProfile(models.Model):
user = models.ForeignKey(User, primary_key=True)
quote = models.CharField('Favorite quote', max_length = 200, null=True, blank=True)
website = models.URLField('Personal website/blog', null=True, blank=True)
class UserProfileForm(ModelForm):
class Meta:
model = UserProfile
fields = ('quote', 'website')
@login_required
def user_profile(request):
user = User.objects.get(pk=request.user.id)
if request.method == 'POST':
upform = UserProfileForm(request.POST)
if upform.is_valid():
up = upform.save(commit=False)
up.user = request.user
up.save()
return HttpResponseRedirect('/accounts/profile')
else:
upform = UserProfileForm()
return render_to_response('reserve/templates/edit_profile.html', locals(), context_instance=RequestContext(request))
答案 0 :(得分:3)
代码就像你编写的那样工作,但是因为你没有将一个实例传递给你的模型,所以它有点不寻常,所以可能需要另一个Django开发人员更长时间才能弄清楚发生了什么。
您链接的视图使用实例实例化模型表单,以便在表单中显示现有的配置文件值。在你的情况下,你会得到空的字段。
upform = UserProfileForm(instance=user.get_profile())
因为您没有提供实例,所以保存将尝试创建我们不想要的新user_profile
。在你的情况下不会发生这种情况,因为你已经将user
作为主键,但这也有点不寻常。
编写user.get_profile()
的主要优点是您不需要知道哪个模型用于用户配置文件。如果您愿意在代码中对UserProfile
模型进行硬编码,则可以改为instance=UserProfile.objects.get(user=user)
。