我正在开发一个应用程序,用户可以使用我使用python-social-auth
实现的Twitter帐户凭据登录我的应用程序。现在,Django的身份验证系统提供User
个对象,其中包含username
,password
,email
,first_name
和last_name
五个主要属性}如文档中所示:https://docs.djangoproject.com/en/1.7/topics/auth/default/#user-objects
现在,在用户使用他/她的Twitter帐户成功登录后,我希望我的表单中的某些字段,例如用户的全名,电子邮件地址,Twitter帐户用户名等预先填写。出于这个目的,我使用了类似这样的东西预填充用户的全名表单字段:
{% if user and not user.is_anonymous %}
Full Name: <input type = "text" name = "name" value = "{{user.get_full_name}}"">
{% endif %}
这是用户通过他/她的Twitter帐户成功登录后上述表单字段的内容:
完美!按预期工作。同样,username
,last_name
,first_name
等属性适用于当前登录的User
对象。
但是,当我尝试使用以下方式预填表单中的电子邮件地址字段时
Email Address: <input type = "text" name = "email" value = "{{user.email}}"">
但是,{{user.email}}
的值不会返回任何内容,而我的表单字段看起来像这样:
为什么email
对象的User
属性没有返回用户使用其Twitter凭据登录的电子邮件地址?所有其他User
属性似乎都运行得很好。这背后的任何推理?
编辑1:
这就是管理员的数据库:
因此email
字段为空,因此User
对象不返回该属性值。但是,每当新用户使用他们的Twitter帐户登录时,为什么电子邮件地址不会存储在数据库中?
答案 0 :(得分:1)
使用python-social-auth时,电子邮件会存储在其他位置。他们创建了一个SocialUser表,您搜索的数据可能会以{J}格式存储在extra_data
字段中 - 请查看由PSA创建的model
提取其他信息可能不像以前那么简单,但您可以添加在创建社交用户时将电子邮件地址保存到用户桌面的功能。见Pipeline
答案 1 :(得分:0)
在管理员中,如果未显示user_email,则可能没有为特定用户添加电子邮件。
通过再次检查数据库来确保这一点。
答案 2 :(得分:0)
这可能是因为您的注册过程中没有任何内容实际上将电子邮件存储在表单的数据库中,因此在您的视图中有类似
的内容p = #user object from form.
p.email = request.POST['email']
p.save()