ism*_*ail 31 python django profile registration django-forms
我正在使用django-registration和django-profile来处理注册和配置文件.我想在注册时为用户创建个人资料.我创建了一个自定义注册表单,并使用以下教程将其添加到urls.py:
本教程中的基本思想是覆盖默认注册表单以同时创建配置文件.
forms.py - 在我的个人资料应用中
from django import forms
from registration.forms import RegistrationForm
from django.utils.translation import ugettext_lazy as _
from profiles.models import UserProfile
from registration.models import RegistrationProfile
attrs_dict = { 'class': 'required' }
class UserRegistrationForm(RegistrationForm):
city = forms.CharField(widget=forms.TextInput(attrs=attrs_dict))
def save(self, profile_callback=None):
new_user = RegistrationProfile.objects.create_inactive_user(username=self.cleaned_data['username'],
password=self.cleaned_data['password1'],
email=self.cleaned_data['email'])
new_profile = UserProfile(user=new_user, city=self.cleaned_data['city'])
new_profile.save()
return new_user
Run Code Online (Sandbox Code Playgroud)
在urls.py中
from profiles.forms import UserRegistrationForm
Run Code Online (Sandbox Code Playgroud)
和
url(r'^register/$',
register,
{'backend': 'registration.backends.default.DefaultBackend', 'form_class' : UserRegistrationForm},
name='registration_register'),
Run Code Online (Sandbox Code Playgroud)
显示表单,我可以在City中输入,但不会在DB中保存或创建条目.
sha*_*ker 29
你已经到了一半 - 你已经成功构建了一个替换默认表单的自定义表单.但是您尝试在模型表单上使用save()方法进行自定义处理.这在旧版本的django-registration中是可能的,但我可以从你在URL conf中指定后端使用v0.8的事实中看到.
该升级指南说:
以前,用于在注册期间收集数据的表单应该实现save()方法,该方法将创建新的用户帐户.这已不再是这种情况; 创建帐户由后端处理,因此任何自定义逻辑都应移动到自定义后端,或者将侦听器连接到注册过程中发送的信号.
换句话说,当你使用版本0.8时,表单上的save()方法将被忽略.您需要使用自定义后端或信号进行自定义处理.我选择创建一个自定义后端(如果有人使用信号,请发布代码 - 我无法以这种方式工作).您应该可以修改此项以保存到自定义配置文件.
所以URL conf是:
url(r'^accounts/register/$',
register,
{'backend': 'accounts.regbackend.RegBackend','form_class':MM_RegistrationForm},
name='registration_register'
),
Run Code Online (Sandbox Code Playgroud)
regbackend.py有必要的导入,基本上只是一个DefaultBackend的副本,只有register()方法,并添加:
u = User.objects.get(username=new_user.username)
u.first_name = kwargs['first_name']
u.last_name = kwargs['last_name']
u.save()
Run Code Online (Sandbox Code Playgroud)
Mit*_*tar 11
正如我在Django Trac票证评论中所描述的,我制作了一个元类和mixin,以允许ModelForm
Django表单的多重继承.有了这个,你可以简单地制作一个表格,允许同时注册用户和个人资料模型的字段,无需硬编码字段或重复自己.通过使用我的元类和mixin(以及fieldset mixin),您可以:
class UserRegistrationForm(metaforms.FieldsetFormMixin, metaforms.ParentsIncludedModelFormMixin, UserCreationForm, UserProfileChangeForm):
error_css_class = 'error'
required_css_class = 'required'
fieldset = UserCreationForm.fieldset + [(
utils_text.capfirst(UserProfileChangeForm.Meta.model._meta.verbose_name), {
'fields': UserProfileChangeForm.base_fields.keys(),
})]
def save(self, commit=True):
# We disable save method as registration backend module should take care of user and user
# profile objects creation and we do not use this form for changing data
assert False
return None
__metaclass__ = metaforms.ParentsIncludedModelFormMetaclass
Run Code Online (Sandbox Code Playgroud)
在哪里UserCreationForm
可以是例如django.contrib.auth.forms.UserCreationForm
形式和UserProfileChangeForm
简单ModelForm
的您的个人资料模型.(不要忘记设置editable
到False
你的外键User
的模式.)
使用django-registration后端有这样的注册方法:
def register(self, request, **kwargs):
user = super(ProfileBackend, self).register(request, **kwargs)
profile, created = utils.get_profile_model().objects.get_or_create(user=user)
# lambda-object to the rescue
form = lambda: None
form.cleaned_data = kwargs
# First name, last name and e-mail address are stored in user object
forms_models.construct_instance(form, user)
user.save()
# Other fields are stored in user profile object
forms_models.construct_instance(form, profile)
profile.save()
return user
Run Code Online (Sandbox Code Playgroud)
注意在该方法的开头(在超类中的方法中)而不是在结尾处发送注册信号.
以同样的方式,您可以为用户和个人资料信息创建更改表单.您可以在我上面提到的关于Django Trac票的评论中找到此示例.