今日は特別な状況に遭遇しました。以前は、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 つのエラーがベース ユーザー クラスに存在することを意図していたことです。ここからどうやって彼らにたどり着くのですか?
編集2:
PyCharm は、2 つの self._db と seld.model が現在の cb_user_model_backend で終了しないと文句を言います。
View は 2 つのパラメーターを受け取るようにリファクタリングされていることに注意してください。
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)