2016-10-13 27 views
0

私はこれについて2,3日を費やして、ドキュメントを読んで、2つのスクープ情報を読んで、何かを見逃しています。私はAbstractUserにログインするためのビューを作ろうとしています。 AbstractUserモデルはmy_appにあり、ビューはmainsiteというアプリケーションにあり、プロジェクト全体のビューを保存するために使用します。抽象的なユーザーログインビュー

ユーザーがログインすると、データベースレコードの追加、編集、および削除に使用するクラスベースのビューにアクセスできます。これらのユーザーはスタッフではないため、管理者へのアクセスを許可していません。

ユーザーとしてログインしようとするたびに、authenticate(username, password)(views.py内)はnoneを返します。

私には何が欠けていますか?ここで

は、セットアップだ - 私はAbstractUserモデルを拡張し、カスタムのPersonモデルを持っている:

# my_app.models.py 
class Person(AbstractUser): 
    date_left = models.DateField(blank=True, null=True) 
    phone_number = models.IntegerField(blank=True, null=True) 

    def _full_name(self):   
     return self.get_full_name() 
    full_name = property(_full_name) 

    def __str__(self): 
     return self.get_full_name() 

    class Meta: 
     verbose_name_plural = 'People'  

私はsettings.pyのために人を追加しました:

# settings.py 
... 
AUTH_USER_MODEL = "my_app.Person" 
... 

私は次のURLconfを持っています:ユーザーで

# project/urls.py 
from mainsite.views import login_view 
... 
url(r'^login/$', login_view, name='login'), 
... 

このビュー・ログ:

# mainsite.views.py 
def login_view(request): 
    if request.method == 'POST': 
     username = request.POST['username'] 
     password = request.POST['password'] 
     user = authenticate(username=username, password=password) 
     if user is not None: 
      login(request, user) 
      return render(request, 'logged_in.html') 
     else: 
      return render(request, 'login.html', 
       {'message': 'Bad username or password'} 
      ) 
    else: 
     return render(request, 'login.html') 

そして最後に、ここでのログインフィールドを持つテンプレートです:

#templates/login.html 
<form action="{% url 'login' %}" method="post"> 
    {% csrf_token %} 
    <div class="row column"><h1>Login</h1></div> 
    {% if message %} 
     <div class="row"> 
      <div class="small-12 medium-6 columns"> 
       <div class="alert callout"> 
        <p>{{ message }}</p> 
       </div> 
      </div> 
     </div> 
    {% endif %} 
    <div class="row"> 
     <div class="small-12 medium-6 columns"> 
      <label>Username 
       <input type="text" id="username" name="username"> 
      </label> 
     </div> 
    </div> 
    <div class="row"> 
     <div class="small-12 medium-6 columns"> 
      <label>Password 
       <input type="password" id="password" name="password"> 
      </label> 
     </div> 
    </div> 
    <div class="row"> 
     <div class="small-12 medium-6 columns"> 
      <input type="submit" value="Log in" class="button"> 
     </div> 
    </div> 
</form> 
+0

どのようにして最初にユーザーを作成しましたか? –

+0

管理者の使用。私は問題を発見した:カスタムのUserCreationFormとUserChangeFormを作成する必要がある。 – acdn

答えて

1

私はドキュメントに(のredditからの助けを借りて)答えを見つけました。

When you use AbstractUser, you need to create your own UserCreationForm and UserChangeForm. AbstractBaseUserを使用する場合、追加のフォームを作成する必要があります。

私はこれらのフォームを作成していませんでしたが、管理者はDjangoによって自動的に生成されたフォームを使用してユーザーを作成しました。これらのフォームはパスワードを正しく設定しませんでした。おそらく自動的に生成されたフォームはuser.password = 'some_password'です。正しい方法はuser.set_password('some_password')です。

関連する問題