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

sha*_*aka 5 python django profile model view

我在这里看到了另一个答案 以及网络上推荐在扩展内置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')
Run Code Online (Sandbox Code Playgroud)

视图

@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))
Run Code Online (Sandbox Code Playgroud)

Ala*_*air 3

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

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

upform = UserProfileForm(instance=user.get_profile())
Run Code Online (Sandbox Code Playgroud)

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

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