2016-03-25 8 views
0

EDIT:あなたがバックグラウンドストーリーをスキップしてちょうどエラーメッセージとコードをチェックしたい場合は、すべての下:)私は「「ユーザー」オブジェクトには属性「バックエンド」を持っていない


ATのダンプ今半日のユーザー登録フォームを実装しようとしていて、私はまだ近いが、まだ近くにいるわけではないと感じている。

だから私はUserCreationFormで構築されたDjangoを実装することから始めました。そして、私のビューのために、私はこのquestionへの応答に触発されたコードのこの部分をcunstructed:

from django.contrib.auth.forms import UserCreationForm 
from django.contrib.auth import login 

def create_user(request): 
    if request.method == "POST": 
     form = UserCreationForm(request.POST) 
     if form.is_valid(): 
      new_user = User.objects.create_user(**form.cleaned_data) 
      login(new_user) 
      return redirect('post_list') 
    else: 
     form = UserCreationForm() 

    return render(request, 'blog/create_user.html', {'form': form}) 

問題だった:私は、ユーザーが同様に彼らの電子メールを保存できるようにしたかったです。だから私はforms.pyファイルにUserCreationForm()を拡張するために、このblogからコードの一部を使用することにしました:

from django import forms 
from django.contrib.auth.models import User 
from django.contrib.auth.forms import UserCreationForm 

class UserCreateForm(UserCreationForm): 
    email = forms.EmailField(required=True) 

    class Meta: 
     model = User 
     fields = ("username", "email", "password1", "password2") 

    def save(self, commit=True): 
     user = super(UserCreateForm, self).save(commit=False) 
     user.email = self.cleaned_data["email"] 
     if commit: 
      user.save() 
     return user 

私は、実際のウェブページを(チェックされている場合それはまだ私が切り替わった後も、電子メールの部分を含めることを拒否しましたアウト:from django.contrib.auth.forms import UserCreationForm~from .forms import UserCreationForm)。最後に、views.pyforms.pyファイルの両方で、自分のforms.pyファイルの名前をUserFormに変更しました。だから、forms.pyファイルで、それは今言った:このquestionに触発

class UserForm(UserCreationForm): 

ソリューション。

だから私は "もちろん、私は自分のフォームからcreate_userに辞書を渡していますが、UserCreationFormと改ざんしてしまったので、これ以上はスムーズに実行されません:create_userは持っています?。ユーザー名、メールアドレスとパスワード右しかし、今、私は、ユーザー名、電子メール、パスワード1とパスワード2を送信してい

は、だから私はviews.pyのコードに次を追加しました:

if form.is_valid(): 
    username = form.cleaned_data["username"] 
    email = form.cleaned_data["email"] 
    password = form.cleaned_data["password1"] 
    new_user = User.objects.create_user(username, email, password) 
    login(new_user) 

だから今、私はTypeError at /create_user/: login() takes exactly 2 arguments (1 given)を取得し、本当に私の歯車を粉砕するのは、私が改ざんする前にこれがどういう問題ではなかったかということですUserCreationForm(私の思い込みの中で最高です)。しかし、大丈夫、大丈夫、私は、それをグーグルドキュメントといくつかの例を読んで、ほとんどの人は、私は再び私のコードを変更login(request, user)でログイン機能を呼び出すようになりますよ:

new_user = User.objects.create_user(username, email, password) 
login(request, new_user) 

そしてここで、私は」私が得るようメートルは最終的に行き詰まりで:

'User' object has no attribute 'backend' 

私はそれをGoogleとのいずれか私は私の状況と相関するか、私はそれがないことを確認するために頭の悪いしね何かを見つけることはありません。何が間違っているのか説明できる人がいるなら、私はそれを高く評価します。

現在のコードのコードダンプ:
は、他のビューと可読性

views.py

from django.shortcuts import render 
from .forms import UserForm 
from django.shortcuts import redirect 
from django.contrib.auth.models import User 
from django.contrib.auth import login 

def create_user(request): 
    if request.method == "POST": 
     form = UserForm(request.POST) 
     if form.is_valid(): 
      username = form.cleaned_data["username"] 
      email = form.cleaned_data["email"] 
      password = form.cleaned_data["password1"] 
      new_user = User.objects.create_user(username, email, password) 
      login(new_user) 
      return redirect('post_list') 
    else: 
     form = UserForm() 

    return render(request, 'blog/create_user.html', {'form': form}) 

形態のための無関係な輸入を省略します。docsからPY

from django import forms 
from django.contrib.auth.models import User 
from django.contrib.auth.forms import UserCreationForm 

class UserForm(UserCreationForm): 
    email = forms.EmailField(required=True) 

    class Meta: 
     model = User 
     fields = ("username", "email", "password1", "password2") 

    def save(self, commit=True): 
     user = super(UserForm, self).save(commit=False) 
     user.email = self.cleaned_data["email"] 
     if commit: 
      user.save() 
     return user 

答えて

3

呼び出す認証()最初に手動で、あなたが成功し 認証でユーザーを認証する必要があり、ユーザーがログインしている

()あなたの前にcall login()を呼び出します。 authenticate()は、 認証バックエンドがそのユーザーを正常に認証したことを示すユーザーの属性を設定します(詳しくは、 バックエンドのドキュメントを参照してください)。この情報は後でログインプロセス中に に必要です。データベースから直接取得したユーザオブジェクトを にログインしようとすると、エラーが発生します。

ので、ユーザーにログインするためには、まずauthenticate()を呼び出し、ユーザーが返されるかどうかを確認する必要があります。

new_user = User.objects.create_user(username, email, password) 
new_user = authenticate(username=username, password=password) 
if new_user: 
    login(request, new_user)