質問

私はウェブサイトを作りようとしています。そこでは、人々が電子メールアドレスを置くだけで、Cookieなどでログインしています。後の段階では、パスワードと名前を提供するように依頼しますが、ユーザー名は使用されません。 Django-Registraitionでこれをやろうとしていますが、エラーが発生し、いくつかの問題があります。

まず、ユーザー名をログイン機能として無効にするために、ユーザー名の代わりにSTR(Time())を配置します - 毎回変更されるものを探していました。

ただし、認証をスキップすると(現在は必要ありません)、エラーが発生します。

'RegistrationProfile' object has no attribute 'backend'

または、認証を残すこともできますが、電子メールとパスワードのみで認証する方法がわかりません。また、次の行を機能させる方法がわかりません:

auth.login(request, ProfileUser)

誰かが私をここから連れ出すことができれば、それは素晴らしいでしょう。ここにいくつかのコードがあります:

私のフォームクラス:

class RegistrationFormCustom(forms.Form):
email = forms.EmailField()
def do_save(self):
    new_u = User(username=str(time()),email= self.cleaned_data.get('email'),)
    new_u.save()
    new_p = Profile.objects.create_profile(new_u)
    new_p.save()
    return new_p

私の見解:

def registerCustom(request, backend, success_url=None, form_class=None,
         disallowed_url='registration_disallowed',
         template_name='registration/registration_form.html',
         extra_context=None,
     initial={}):

form = RegistrationFormCustom(initial=initial)
if request.method == 'POST':
    form = RegistrationFormCustom(initial=initial, data=request.POST)
    if form.is_valid():
        profile = form.do_save()
        profile = auth.authenticate(username = profile.user.email, password = form.cleaned_data.get('pass1'))
        print(profile)
        auth.login(request, profile)
        return redirect('/')

    else:
        pass

return render_jinja(request, 'registration/registration_form.html',
        type="register",
        form = form
        )

そして、私は喜んで必要な他の切り抜きを投稿します

役に立ちましたか?

解決

あなたはを取得しています 'RegistrationProfile' object has no attribute 'backend' ユーザーがまだ認証されていないためエラー。誰かにログインするには、 authenticate 最初にメソッド、パスワードが必要です。だから、代わりにあなたができることはこれです:

from django.contrib.auth import load_backend, login, logout
from django.conf import settings

def _login_user(request, user):
    """
    Log in a user without requiring credentials (using ``login`` from
    ``django.contrib.auth``, first finding a matching backend).

    """
    if not hasattr(user, 'backend'):
        for backend in settings.AUTHENTICATION_BACKENDS:
            if user == load_backend(backend).get_user(user.pk):
                user.backend = backend
                break
    if hasattr(user, 'backend'):
        return login(request, user)

次に、誰かにログインするには、 _login_user リクエストで機能します User モデル。 (これは次のようになります profile.user あなたの場合、おそらく)電話する代わりにこれを行う auth.login. 。パスワードやユーザー名がなければ、これが有効なユーザーであるかどうかをどのように判断するかはわかりませんが、それを任せます。まだ問題がある場合は、お知らせください。

簡単な説明:

ここで基本的に起こっているのは、Djangoがユーザーに認証される必要があることです。 login 関数。その認証は通常、によって行われます authenticate 関数は、ユーザー名とパスワードを必要とし、提供されたパスワードがデータベースのハッシュバージョンと一致するかどうかを確認します。もしそうなら、それはに認証バックエンドを追加します User モデル。

したがって、パスワードとユーザー名を持っていないため、認証バックエンドをに追加するための独自の方法を記述するだけです。 User モデル。それが私のことです _login_user)機能 - ユーザーがすでに認証されている場合、それはただ呼び出すだけです login, それ以外の場合は、最初にデフォルトのバックエンドをに追加します User モデル、正しいユーザー名とパスワードをチェックすることなく( authenticate します)。

他のヒント

このスレッドを読んでいる他の人のために、user.objects.create_user()の代わりにuser.objects.create()を使用しているときに同様のエラーメッセージが表示されました。基本的に、最初の方法は明確なパスワードを設定するのに対し、Create_Userはパスワードを暗号化することでした。パスワードのクリアは認証に失敗します。データベースを確認します。クリアにパスワードを設定している場合は、代わりにcreate_user()を使用する必要がある可能性があります。

著者のリクエストは、just user.save()の代わりにcreate_user()を使用してデフォルトのユーザーとパスワードを設定するだけで修正できます。

既知のパスワードを作成し(settings.pyに配置)、ユーザーが入力したかのようにそれを使用できます。これでユーザーを作成し、これでユーザーを認証します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top