5

我在这里和网络上的其他地方看到了另一个答案 ,建议在扩展内置 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))
4

1 回答 1

3

代码按照您编写的方式工作,但是由于您没有将实例传递给模型,这有点不寻常,因此可能需要另一个 Django 开发人员更长的时间才能弄清楚发生了什么。

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

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

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

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

于 2012-07-26T14:28:23.577 回答