我今天遇到了一个特殊的情况。以前我的 view.py 中有以下内容
def register_page(request):
if request.method == 'POST':
form = RegistrationForm(request.POST)
if form.is_valid():
user = User.objects.create_user(
username=form.cleaned_data['username'],
password=form.cleaned_data['password2'],
email=form.cleaned_data['email']
)
return HttpResponseRedirect('/register/success/')
else:
form = RegistrationForm()
variables = RequestContext(request, {'form':form})
return render_to_response('registration/register.html', variables)
在她注册后检索用户名、电子邮件和密码以创建新用户非常简单。但是现在我已经将它重构为使用哈希码作为用户名,并单独使用电子邮件进行注册和登录。
缩短的 RegistrationForm 如下所示:
class RegistrationForm(forms.ModelForm):
email = forms.EmailField(label=_("Email"))
password1 = forms.CharField(label=_("Password"), widget=forms.PasswordInput)
password2 = forms.CharField(label=_("Password confirmation"), widget=forms.PasswordInput))
class Meta:
model = User
fields = ("email",)
def save(self, commit=True):
user = super(RegistrationForm, self).save(commit=False)
user.set_password(self.cleaned_data["password1"])
email = self.cleaned_data['email']
user.username = md5(email).digest().encode('base64')[:-1]
if commit:
user.save()
return user
新表单不再有用户名,因为它是计算出来的,不再由用户输入。但是如何从视图中检索用户名?新代码不是来自我,而是来自博客。也许关键在 Meta 类中?从文档中,我无法完全理解他试图通过 Meta 类在这里实现的目标......
非常感谢,
编辑:
好的,我想我现在明白子类化应该如何工作了。我试图像这样子类化 User 类:
class cb_user_model_backend(ModelBackend):
def create_user(self, email=None, password=None):
"""
Creates and saves a User with the given email and password only.
"""
now = timezone.now()
username = md5(email).digest().encode('base64')[:-1]
email = UserManager.normalize_email(email)
user = self.model(username=username, email=email,
is_staff=False, is_active=True, is_superuser=False,
last_login=now, date_joined=now)
user.set_password(password)
user.save(using=self._db)
return user
我现在面临的问题是两个错误,self._db 和 self.model,本应在基本用户类上。如何从这里到达他们?
编辑2:
PyCharm 抱怨两个 self._db 和 seld.model 不会在当前 cb_user_model_backend 上退出。
请注意,视图被重构为采用两个参数:
user = User.objects.create_user(
password=form.cleaned_data['password2'],
email=form.cleaned_data['email']
)
运行它时,堆栈跟踪是:
Exception Type: TypeError
Exception Value:
create_user() takes at least 2 arguments (3 given)