-
02-10-2019 - |
题
我在Stackoverflow上找到了一种方法,可以使用信号扩展Django的内置身份验证。我的基本用户由“电子邮件”和密码定义(因此没有用户名)。因此,我正在尝试根据自己的需求进行修改,但是我的表格遇到了验证错误。奇怪的是,该错误已连接到user..mail字段,即使我目前正在注册,我也已经“正在使用”。它是试图保存2次还是什么?当我将词典带有数据以形成Shell中的ContStructor时,我已经发现了它: form = MyForm(data={})
. 。在此表格之后仍然无效,但是将电子邮件更改为不同的价值最终使我实现了。
连接到注册信号的User_created功能:
def user_created(sender, user, request, **kwargs):
form = CustomRegistrationForm(request.POST, request.FILES)
if form.is_valid():
data = UserProfile(user=user)
data.is_active = False
data.first_name = form.cleaned_data['first_name']
data.last_name = form.cleaned_data['last_name']
data.street = form.cleaned_data['street']
data.city = form.cleaned_data['city']
data.save()
else:
return render_to_response('user/data_operations/error.html', {'errors': form._errors}, context_instance=RequestContext(request))
user_registered.connect(user_created)
我的表格:
class CustomRegistrationForm(RegistrationForm):
first_name = forms.CharField(widget=forms.TextInput(attrs=attrs_dict), max_length=50)
last_name = forms.CharField(widget=forms.TextInput(attrs=attrs_dict), max_length=50)
street = forms.CharField(widget=forms.TextInput(attrs=attrs_dict), max_length=50)
city = forms.CharField(widget=forms.TextInput(attrs=attrs_dict), max_length=50)
我的模型:
class UserProfile(models.Model):
first_name = models.CharField(_("Name"), max_length=50, blank=False,)
last_name = models.CharField(_("Last name"), max_length=50, blank=False,)
street = models.CharField(_("Street"), max_length=50, blank=False,)
city = models.CharField(_("City"), max_length=50, blank=False,)
user = models.ForeignKey(User, unique=True, related_name='profile',)
注册表:类注册表(表格S.Form):
email = forms.EmailField(widget=forms.TextInput(attrs=dict(attrs_dict,
maxlength=75)),
label=_("Adres email"))
password1 = forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict, render_value=False),
label=_("Haslo"))
password2 = forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict, render_value=False),
label=_("Haslo powtorzone"))
def clean_email(self):
email = self.cleaned_data.get("email")
if email and User.objects.filter(email=email).count() > 0:
raise forms.ValidationError(
_(u"Already in use."))
return email
解决方案
保存用户后,发送您的“ user_register”信号。因此,它已经定义了一个“电子邮件”字段。
更新
使用不安的思维:
form = CustomRegistrationForm(request.POST, request.FILES, notvalidateemail=True)
并形式:
def __init__(self, *args, **kwargs):
self.notvalidateemail = kwargs.pop('notvalidateemail',False)
super(CustomRegistrationForm, self).__init__(*args, **kwargs)
def clean_email(self):
if self.notvalidateemail:
return
else:
#your cleaning here
return email
其他提示
问题:
您的表格首先由Django Registration保存。然后,您将其再次保存在user_created中。
解决方案:
在user_created中使用其他形式。一个已经没有保存的字段(这些来自电子邮件之类的用户模型)。您只想将其他数据保存在user_created中,对吗?
向表单添加一些参数:
在User_created中:
form = CustomRegistrationForm(dontvalidateemail=True, request.POST, request.FILES)
并以形式 在里面;
self.dontvalidateemail = dontvalidateemail
然后只需在Clean_email中检查一下即可。
不隶属于 StackOverflow