将用户连接到个人资料

时间:2013-11-07 02:51:06

标签: django django-models django-forms

对于我的项目(Django 1.5),我设置了两个应用程序,一个叫做处理身份验证的帐户,另一个叫处理所有配置文件操作的配置文件。我使用以下设置为帐户应用构建了自定义用户模型:

class CustomUser(AbstractBaseUser):
    email = models.CharField()
    username = models.CharField
    is_staff...

对于个人资料应用:

class UserProfile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL)
    city = models.CharField()
    state = models....

我设置了这种方式,因为我不希望在创建用户时实例化配置文件。我希望它在首次登录时创建。

我正在尝试创建一个modelForm来帮助创建UserProfile。我对如何获得当前已登录的用户以便将其保存到OneToOneField有点困惑。我知道这与表单的init方法有关,但我查看了文档,似乎无法找出明确的解决方案。请帮忙!!所以我创建了一个表单:

class BasicProfile(forms.ModelForm):
    class Meta:
        model = UserProfile
        exclude = ['foo']

我的问题:如何在表单中输入用户?我只是使用:

self.user = request.user 

2 个答案:

答案 0 :(得分:0)

如果启用了AuthenticationMiddleware,请求对象会携带用户属性。所以 - 是的,您可以使用request.user访问它。

请注意,request.user也可以是django.contrib.auth.models.AnonymousUser。您必须首先致电request.user.is_authenticated()确保您正在处理“真实”用户。

在ModelForms中使用排除通常是一个坏主意。一开始这似乎是一个很好的方法,但是当你的应用程序变得更大并且你用这个隐藏的字段更改你的用户模型时你忘了添加排除..;)

答案 1 :(得分:0)

想出来...... @周杰伦 - 谢谢你让我走上正轨。

forms.py:

class FormaholicsAnon(forms.Form):
    name = forms.Char...  
    ...

    def __init__(self, *args, **kwargs):

        self.user = kwargs.pop('user', None)
        super(FormaholicsAnon, self).__init__(*args, **kwargs)

views.py:

# Make sure the current user is not anonymous
if request.user.is_authenticated():
    form = FormaholicsAnon(request.POST, user=request.user)