我什么时候应该在django中使用user.get_profile?

时间:2012-07-26 14:20:51

标签: python django view model profile

我看到了另一个答案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))

1 个答案:

答案 0 :(得分:3)

代码就像你编写的那样工作,但是因为你没有将一个实例传递给你的模型,所以它有点不寻常,所以可能需要另一个Django开发人员更长时间才能弄清楚发生了什么。

您链接的视图使用实例实例化模型表单,以便在表单中显示现有的配置文件值。在你的情况下,你会得到空的字段。

upform = UserProfileForm(instance=user.get_profile())

因为您没有提供实例,所以保存将尝试创建我们不想要的新user_profile。在你的情况下不会发生这种情况,因为你已经将user作为主键,但这也有点不寻常。

编写user.get_profile()的主要优点是您不需要知道哪个模型用于用户配置文件。如果您愿意在代码中对UserProfile模型进行硬编码,则可以改为instance=UserProfile.objects.get(user=user)