允许使用 django-profiles 更改用户字段(如电子邮件)
Posted
技术标签:
【中文标题】允许使用 django-profiles 更改用户字段(如电子邮件)【英文标题】:Allow changing of User fields (like email) with django-profiles 【发布时间】:2009-07-02 16:17:56 【问题描述】:Django 允许您创建一个外键到 User 的模型,并在设置中将其定义为官方“配置文件”模型,其中包含用户帐户的附加数据。 django-profiles 让您轻松显示/创建/编辑该配置文件数据。但是用户的主要电子邮件地址是他们主要帐户的一部分,而不是他们扩展个人资料的一部分。因此当你放
form
在 profile/edit_profile 模板中,主电子邮件地址不显示。您可以使用
手动检索它 user.email
但在提交时,对它的更改当然不会保存回帐户。我假设已经创建了一个自定义 ModelForm,例如:
class ProfileForm(ModelForm):
class Meta:
model = Parent
exclude = ('family','user','board_pos','comm_job',)
并且 ProfileForm 被传递给 django-profiles 的视图代码,其 urlconf 如下:
('^profiles/edit', 'profiles.views.edit_profile', 'form_class': ProfileForm,),
如果您想让用户更改他们的名字或姓氏,也会出现同样的问题。在使用 django-profiles 时,让用户更改自己的电子邮件地址或姓名的最佳方法是什么?
【问题讨论】:
【参考方案1】:这是我们最终使用的解决方案:
# urls.py
# First match /profiles/edit before django-profiles gets it so we can pass in our custom form object.
('^profiles/edit', 'profiles.views.edit_profile', 'form_class': ProfileForm,),
(r'^profiles/', include('profiles.urls')),
现在我们重写表单本身的save方法,这样当表单被保存时,邮箱地址同时被推送到保存用户的User对象中。优美。
# forms.py , trimmed for brevity
class ProfileForm(ModelForm):
def __init__(self, *args, **kwargs):
super(ProfileForm, self).__init__(*args, **kwargs)
try:
self.fields['email'].initial = self.instance.user.email
except User.DoesNotExist:
pass
email = forms.EmailField(label="Primary email")
class Meta:
model = Parent
def save(self, *args, **kwargs):
"""
Update the primary email address on the related User object as well.
"""
u = self.instance.user
u.email = self.cleaned_data['email']
u.save()
profile = super(ProfileForm, self).save(*args,**kwargs)
return profile
完美运行。谢谢mandric。
【讨论】:
感谢这个优雅的解决方案!【参考方案2】:我认为最好只为更改电子邮件实现一个单独的页面,因为它需要验证等...
如果您想让用户修改他们的所有个人资料信息以及他们的主要电子邮件地址,那么您需要创建自己的表单(ModelForm 在这里不起作用)。我建议您开始这样做,并在遇到困难时发布问题。
首先将 django-profile 模型中的所有字段复制到您的自定义表单中,然后添加用户主电子邮件字段。
您必须“覆盖”django-profile 编辑 url,如果有的话,基本上复制 html 模板。
另一个选择(不好的)是破解 django-profiles 应用程序并在那里进行更改。但这很可能会引入很多错误,并使您的应用无法升级。
【讨论】:
目前建议的解决方案非常相似,而且 michuk 的示例代码非常有用,但是 drozzy 提出了一个很好的观点,即在更改这些内容时可能需要验证和单独的批准。我想得越多,我就越意识到更改这些字段时单独的页面是有意义的。【参考方案3】:我认为最简单的方法肯定是使用表单。使用表单显示他们当前的电子邮件地址(他们可以更改),然后使用您的视图提取请求,通过匹配您可以传递给模板的其他一些参数来检索属于该用户的适当配置文件,然后存储新数据并保存模型。
【讨论】:
以上是关于允许使用 django-profiles 更改用户字段(如电子邮件)的主要内容,如果未能解决你的问题,请参考以下文章
包装第 3 方 Django 应用程序的视图时出错? (Facebook、django-socialregistration、django-profiles)
Django-profiles 自定义创建/编辑 modelForm 未正确保存
AWS IAM-如何禁止用户通过控制台进行更改,但允许通过CLI更改API