【问题标题】:When should I use user.get_profile in django?我什么时候应该在 django 中使用 user.get_profile?
【发布时间】:2012-07-25 03:53:56
【问题描述】:

我在网络上看到另一个答案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))

【问题讨论】:

  • 您可以删除视图的user = User.objects.get(pk=request.user.id) 行。 request.user 已经是用户模型实例。此外,locals() 的名字也很可疑;它没有在视图中定义,所以它真的是本地的吗?
  • @JCotton 使用locals() 是一个内置函数。在这里,它被用作避免手动定义模板上下文字典的技巧。这可以节省时间,但明确定义上下文可能是更好的做法。关于request.user 的好点。
  • @Alasdair 嘿,谢谢!不知道locals()

标签: python django view model profile


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 除了替换“upform = UserProfileForm(request. POST)" 与 "upform = UserProfileForm(instance=user.get_profile())"?
  • 保持用户行不变,或者按照 JCotton 在上面评论中的建议将其替换为 user=request.user。创建表单时,instance 是一个额外的参数,它不会替换 data=request.POST。在创建表单时设置instance 两次
猜你喜欢
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 2020-04-23
  • 2018-06-26
  • 2012-09-22
  • 1970-01-01
相关资源
最近更新 更多