django编辑用户和userprofile对象

时间:2012-06-24 15:05:21

标签: django

所以我在django中制作了一个通用的“帐户”页面。我使用了django-registration插件,目前有一个(djang标准)User对象,以及UserProfile和UserProfileForm对象。

这是一个关于风格或最佳实践的问题,我想。我正在计划“正确”或是否有“更好/推荐/标准的方式”来做到这一点?

我打算做的是从request.user创建UserProfile,即:

form = UserProfileForm(instance=User)

(并将该表单发送到视图),以及UserProfileForm:

class UserProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile

    def __init__(self,*args,**kwargs):
        super(UserProfileForm, self).__init__(*args, **kwargs)
        if kwargs.has_key('instance'):
            self.user = kwargs['instance']

我的UserProfile非常类似:

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    points = models.IntegerField(default=0) #how is the user going with scores?

并且用户属于django.contrib.auth.models种。

确定!编辑和保存的处理将通过mixin django的东西完成,或者更可能是因为我没有读取mixins我自己的用户定义的视图来处理post和gets。但忽略这一点 - 因为我确定我应该使用mixins - 是上面的“对吗?”还是有建议吗?

喝彩!

1 个答案:

答案 0 :(得分:1)

看看user profiles on the django docs,其中列出了基础知识。您还应该查看using a form in a view

一些具体的反馈:

  • 您的UserProfile模型正确,但每次添加新用户时都必须创建一个实例(通过管理界面或在您的一个视图中以编程方式)。您可以通过注册用户post_save信号来执行此操作:

    def create_user_profile(sender, instance, created, **kwargs):
        if created:
            UserProfile.objects.create(user=instance)
    post_save.connect(create_user_profile, sender=User)
    
  • 您应该使用UserProfile的实例初始化ModelForm,而不是User。您始终可以使用request.user.get_profile()获取当前用户个人资料(如果您在settings.py中定义AUTH_PROFILE_MODULE)。您的视图可能如下所示:

    def editprofile(request):
        user_profile = request.user.get_profile()
        if request.method == 'POST':
            form = UserProfileForm(request.POST, instance=user_profile)
            if form.is_valid():
                form.save()
                return HttpResponseRedirect('/accounts/profile')
        else:
            form = UserProfileForm(instance=user_profile)
        # ...
    
  • 您的ModelForm中无需 init 覆盖。无论如何,您将使用UserProfile实例调用它。如果要创建新用户,只需调用User构造函数:

    user = User()
    user.save()
    form = UserProfileForm(instance = user.get_profile())
    # ...