Django允许您创建一个外键键入用户的模型,并在设置中将其定义为包含用户帐户附加数据的官方“配置文件”模型。 django-profiles可让您轻松显示/创建/编辑该个人资料数据。但用户的主电子邮件地址是其主要帐户的一部分,而不是其扩展配置文件的一部分。因此,当你把
{{ form }}
在个人资料/ edit_profile模板中,主电子邮件地址未显示。您可以使用手动检索它
{{ user.email }}
但是当提交时,对它的更改不会保存回帐户。我假设已经创建了一个自定义ModelForm,例如:
class ProfileForm(ModelForm):
class Meta:
model = Parent
exclude = ('family','user','board_pos','comm_job',)
并且使用urlconf将ProfileForm传递给django-profiles的视图代码:
('^profiles/edit', 'profiles.views.edit_profile', {'form_class': ProfileForm,}),
如果您想让用户更改他们的名字或姓氏,也会出现同样的问题。在使用django-profiles时,让用户更改自己的电子邮件地址或名称的最佳方法是什么?
答案 0 :(得分:8)
以下是我们最终使用的解决方案:
# 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。
答案 1 :(得分:2)
我认为实施一个单独的页面只是为了更改电子邮件是最好的,因为它需要经过验证等...
如果您希望用户能够将他们的所有个人资料信息与他们的主电子邮件地址一起修改,那么您需要创建自己的表单(ModelForm在此处不起作用)。我建议你开始这样做,并在遇到问题时发一个问题。
首先将django-profile模型中的所有字段复制到自定义表单中,然后添加用户主电子邮件字段。
你必须“覆盖”django-profile编辑网址,并基本上复制html模板(如果有的话)。
另一个选择(糟糕)是破解django-profiles应用程序并在那里进行更改。但这可能会引入很多错误,并会使您的应用无法降级。
答案 2 :(得分:1)
我认为最简单的方法肯定是使用表格。使用表单显示他们当前的电子邮件地址(他们可以更改),然后使用您的视图提取请求,通过匹配您可以传递给模板的其他参数来检索属于该用户的相应配置文件,然后存储新数据并保存模型。