-1

今日は特別な状況に遭遇しました。以前は、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)
4

1 に答える 1

0

models.pyでsaveメソッドをサブクラス化してみてください。

def save(self, *args, **kwargs):
    if not self.id:
        self.username = md5(self.email).digest().encode('base64')[:-1]
    super(ModelName, self).save(*args, **kwargs)

user.save()を呼び出した後、user.usernameは、ビューで生成されたユーザー名を生成する必要があります。お役に立てれば。

編集:create_user(** kwargs)を呼び出したい場合は、views.pyで次のようにすることができます。

email = self.cleaned_data['email']
username = md5(email).digest().encode('base64')[:-1]
u = User.objects.create_user(username = username, email = email, password = password)
于 2012-06-18T22:28:06.203 に答える