gpt4 book ai didi

python - 使用 django-registration 保存用户配置文件

转载 作者:行者123 更新时间:2023-12-01 05:59:18 24 4
gpt4 key购买 nike

我正在使用 Django 注册,与其他人不同,我似乎遇到了相反的问题。我的 User 对象保存得很好,但我的 UserProfile 对象却没有!

我关注了这个网站:

http://birdhouse.org/blog/2009/06/27/django-profiles/

这真的很好,所以现在我有了:

class ProfileForm(forms.ModelForm):

YESNO = [
(True,mark_safe('<img src="/static_files/greenTick.png"/>')),
(False,mark_safe('<img src="/static_files/redCross.png"/>'))]

class Meta:
model = UserProfile
exclude = ('isTweeting','points','user')
fields = ('display_name','first_name','last_name','email','gravatar')

def __init__(self, *args, **kwargs):
super(ProfileForm, self).__init__(*args, **kwargs)
self.fields['email'].initial = self.instance.user.email
self.fields['first_name'].initial = self.instance.user.first_name
self.fields['last_name'].initial = self.instance.user.last_name
self.fields['display_name'].initial = self.instance.user.username
self.fields['gravatar'].initial = self.instance.usesGravatar

#add in the input to size it juuuuust right.
email = forms.EmailField(label="Primary email",help_text='',widget=forms.TextInput(attrs={'class': 'wideInput'}))
first_name = forms.Field(label="First name",help_text='',required=False,widget=forms.TextInput(attrs={'class': 'wideInput'}))
last_name = forms.Field(label="Last name",help_text='',required=False,widget=forms.TextInput(attrs={'class': 'wideInput'}))
display_name = forms.Field(label="Display name",help_text='',widget=forms.TextInput(attrs={'class': 'wideInput'}))
gravatar = ImgModelChoiceField(label='Gravatar', choices=YESNO, widget=forms.RadioSelect(renderer=ImgRadioFieldRenderer))

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.username = self.cleaned_data['display_name']
u.first_name = self.cleaned_data['first_name']
u.last_name = self.cleaned_data['last_name']
u.save()

self.instance.gravatar = (self.cleaned_data['gravatar'] == 'True')
profile = super(ProfileForm, self).save(*args,**kwargs)
return profile

该对象作为 form_class 传递到 Django-profile 中以供使用,如上面网站中所述。我遇到的问题是,当我提交表单时,虽然“用户”数据已正确更新 - 电子邮件或其他内容中的任何更改都会传播到数据库 - 对“gravatar”值的更改不会发送。也不会引发任何错误。

有什么想法我应该做什么吗?

最佳答案

我在这里大胆猜测一下

def save(self, *args, **kwargs):
...

self.instance.gravatar = (self.cleaned_data['gravatar'] == 'True')
profile = super(ProfileForm, self).save(*args,**kwargs)
return profile

看来您正在使用自定义小部件,从外观上看,您需要将字符串 'True' (从表单传回)更改为 bool 值 True 将其保存到数据库之前。不过,当您在下一行调用 save() 时,ModelForm 将使用数据覆盖您为 self.instance.gravatar 提供的值直接来自表单的cleaned_data:

https://github.com/django/django/blob/master/django/forms/models.py#L351

<小时/>

此外,在 __init__ 中,您不需要包含

self.fields['gravatar'].initial = self.instance.usesGravatar

因为该字段已绑定(bind)到模型表单,并且当您实例化表单以及 View 中的实例时,该字段将自动填充(例如,如果正在编辑 UserProfile)。

<小时/>

最后,在您的中,您不需要同时包含排除字段,其中之一就可以了。

关于python - 使用 django-registration 保存用户配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11254464/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com