django注册使用信号创建空白django-profiles [英] django-registration creating blank django-profiles using signals
问题描述
我已经完成了解决方案 here 和Shacker的 django-profiles:The Missing Manual 及其后的信号解决方案 Dmitko ,并回答 以下是详细信息: 从members.models.py From members.forms.py:
AUTH_PROFILE_MODULE =members.Profile
class Profile(models.Model):
member model。
GENDER_CHOICES =(
(1,'Male'),
(2,'女'),
)
user = models.ForeignKey(User,unique = True)
first_name = models .CharField(_('first name'), max_length = 100)
middle_name = models.CharField(_('middle name'),blank = True,max_length = 100)
last_name = models.CharField(_('last name'),max_length = 100)
slug = models.SlugField(_('slug'),unique = True)
gender = models.PositiveSmallIntegerField(
_('gender'),
choices = GENDER_CHOICES,
blank = True,
null = True,
)
birth_date = models.DateField(_('birth date'),blank = True,null = True b
$ b class Meta:
verbose_name = _('Profiles')
verbose_name_plural = _('Profiles')
db_table ='Profiles'
ordering =( 'last_name','first_name',)
$ b
从basic.members.models导入的用户
导入配置文件
from registration.forms import RegistrationForm,RegistrationFormTermsOfService,Regi strationFormUniqueEmail
从django.db.models导入信号
from basic.members.signals import create_profile
attrs_dict = {'class':'required'}
class ProfileForm(RegistrationFormTermsOfService,RegistrationFormUniqueEmail):
GENDER_CHOICES =(
(1,'Male'),
(2,'女'),
)
first_name = forms.CharField(widget = forms.TextInput(attrs = attrs_dict))
last_name = forms.CharField(widget = forms.TextInput(attrs = attrs_dict))
gender = forms.IntegerField(widget = forms.RadioSelect(choices = GENDER_CHOICES))
birth_date = forms.DateField(widget = SelectDateWidget(years = range(1911,1999)))
def save(self,user):
try:
data = user.get_profile()
除了:
data = Profile(user = user)
data.first_name = self.cleaned_data [first_name]
data.first_name = self.cleaned_data [last_name]
data.save()
class UserRegistrationForm(RegistrationForm):
first_name = forms.CharField(max_length = 100)
last_name = forms.CharField(max_length = 100 )
signals.post_save.connect(create_profile,sender = User)
from members.signals.py:
def create_profile(sender,instance,signal,created,** kwargs):
创建用户时也创建一个匹配的配置文件。
from basic.members.models import配置文件
如果创建:
配置文件user = instance).save()
和members.regbackend.py:
def create_profile(sender,instance,signal,created,** kwargs):
创建用户时也创建一个匹配的配置文件
从basic.members.models导入配置文件
如果创建:
配置文件(用户=实例).save()
我是st科军。我的ProfileForm基本上是添加字段到用户注册页面,但保存,它正在创建一个用户对象与用户名的电子邮件地址,但在用户对象或配置文件对象不保存名字和姓氏。但是,使用空白字段创建一个空白配置文件。我必须丢失一些小的东西,但我似乎看不到它。
所以信号正在工作,但是数据没有被保存到配置文件中。老实说,我们心爱的Django的这个解决方案应该在一个最佳实践中放在一起的地方。
帮助。
您的会员
在哪里定义?我甚至不能看到它被导入您的 ProfileForm
。您是否在同一页面上放置 ProfileForm
和 UserRegistrationForm
如果用户正在填写这两种表单(甚至填写 ProfileForm
),则不需要信号 - 在 save )
为您的 ProfileForm
,只需为您创建个人资料:
<$ p $
$ =
$ =
$ =
$ = )
data.first_name = self.cleaned_data [first_name]
data.first_name = self.cleaned_data [last_name]
data.save()
I have gone through the solution here and Shacker's django-profiles: The Missing Manual and subsequent signals solution by Dmitko and answers here and many places.
Here are the details:
AUTH_PROFILE_MODULE = "members.Profile
"
From members.models.py
class Profile(models.Model):
"""member model."""
GENDER_CHOICES = (
(1, 'Male'),
(2, 'Female'),
)
user = models.ForeignKey(User, unique=True)
first_name = models.CharField(_('first name'), max_length=100)
middle_name = models.CharField(_('middle name'), blank=True, max_length=100)
last_name = models.CharField(_('last name'), max_length=100)
slug = models.SlugField(_('slug'), unique=True)
gender = models.PositiveSmallIntegerField(
_('gender'),
choices=GENDER_CHOICES,
blank=True,
null=True,
)
birth_date = models.DateField(_('birth date'), blank=True, null=True)
class Meta:
verbose_name = _('Profiles')
verbose_name_plural = _('Profiles')
db_table = 'Profiles'
ordering = ('last_name', 'first_name',)
From members.forms.py:
from django.contrib.auth.models import User
from basic.members.models import Profile
from registration.forms import RegistrationForm, RegistrationFormTermsOfService, RegistrationFormUniqueEmail
from django.db.models import signals
from basic.members.signals import create_profile
attrs_dict = { 'class': 'required' }
class ProfileForm(RegistrationFormTermsOfService, RegistrationFormUniqueEmail):
GENDER_CHOICES = (
(1, 'Male'),
(2, 'Female'),
)
first_name = forms.CharField(widget=forms.TextInput(attrs=attrs_dict))
last_name = forms.CharField(widget=forms.TextInput(attrs=attrs_dict))
gender = forms.IntegerField(widget=forms.RadioSelect(choices=GENDER_CHOICES))
birth_date = forms.DateField(widget=SelectDateWidget(years=range(1911,1999)))
def save(self, user):
try:
data = user.get_profile()
except:
data = Profile(user=user)
data.first_name = self.cleaned_data["first_name"]
data.first_name = self.cleaned_data["last_name"]
data.save()
class UserRegistrationForm(RegistrationForm):
first_name = forms.CharField(max_length=100)
last_name = forms.CharField(max_length=100)
signals.post_save.connect(create_profile, sender=User)
From members.signals.py:
def create_profile(sender, instance, signal, created, **kwargs):
"""When user is created also create a matching profile."""
from basic.members.models import Profile
if created:
Profile(user = instance).save()
And members.regbackend.py:
def create_profile(sender, instance, signal, created, **kwargs):
"""When user is created also create a matching profile."""
from basic.members.models import Profile
if created:
Profile(user = instance).save()
I am stuck. Basically my ProfileForm is adding fields to User Registration page but on saving, it is creating a User object with the username an email address but with First and Last name either in the User Object nor the Profile Object are not saved. However a blank Profile is created with the blank fields. I must be missing something small but I can't seem to see it.
So the signals are working but the data is not being saved into the profile.
Honestly, this solution in to our beloved Django should all be in one place with best practice put together for ease.
Help.
Where is your Member
model defined? I can't even see it being imported for your ProfileForm
. Are you putting the ProfileForm
and UserRegistrationForm
on the same page?
If users are filling out both forms (or even filling out the ProfileForm
), you don't need a signal - in your save()
for your ProfileForm
, just have it create the profile for you:
def save(self, user):
try:
data = user.get_profile()
except:
data = Profile(user=user)
data.first_name = self.cleaned_data["first_name"]
data.first_name = self.cleaned_data["last_name"]
data.save()
这篇关于django注册使用信号创建空白django-profiles的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!