2016-05-29 9 views
2

Django newbieここでカスタムログインフォーム、ビュー、テンプレートを作成しようとしています。私の問題は、私のビューのロジックはフォームが表示されない原因となり、代わりにelseステートメントからのエラーメッセージが常に表示されることです。私は何かが欠けていると確信しています、私はそれが何であるか分かりません。誰かが私を正しい方向に向けることができますか?私はDjangoのドキュメントとこのチュートリアルから作業しています:http://www.djangobook.com/en/2.0/chapter14.htmlありがとう!カスタムDjangoログインページでログインフォームが表示されない

UPDATE:ユーザー@AKSはPOST/GETロジックを適切に処理していないと指摘したので、これを答えとして受け入れました。コードを調整してもフォームは表示されないので、HTMLファイルでいくつかのエラーを見つけて修正しました。修正されたコードはこの記事の一番下に示されています。

-

# Django imports 
from django import forms 
from django.contrib import auth 
from django.contrib.auth.decorators import login_required 
from django.contrib.auth.forms import UserCreationForm 
from django.contrib.auth.models import User 
from django.contrib.auth.views import login, logout 
from django.http import HttpResponse, HttpResponseRedirect 
from django.shortcuts import get_object_or_404, redirect, render 
from django.utils import timezone 

# Local Django imports 
from .models import * 
from .forms import * 


def login(request, method='POST'): 
    '''Shows a login form and a registration link.''' 

    username = request.POST.get('username', '') 
    password = request.POST.get('password', '') 
    user = auth.authenticate(username=username, password=password) 

    if user is not None and user.is_active: 
     auth.login(request, user) 
     return HttpResponseRedirect("client/items") 

    else: 
     return HttpResponse("Invalid login. Please try again.") 

    return render(request, "registration/login.html", {'next':'/client/items'}) 

- - views.py登録/ login.htmlと -

{% extends "registration/base.html" %} 

{% block content %} 

{% if form.errors %} 
<p>Your username and password didn't match. Please try again.</p> 
{% endif %} 

<form method="post" action='/login'>{% csrf_token %} 
<table> 
<tr> 
    <td>{{ form.username.label_tag }}</td> 
    <td>{{ form.username }}</td> 
</tr> 
<tr> 
    <td>{{ form.password.label_tag }}</td> 
    <td>{{ form.password }}</td> 
</tr> 
</table> 

<input type="submit" value="Login" /> 
<input type="hidden" name="next" value="{{ next }}" /> 
</form> 

{% endblock %} 

- settings.py -

INSTALLED_APPS = [ 
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'clients' 
] 

MIDDLEWARE_CLASSES = [ 
    'django.middleware.security.SecurityMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
] 

- アプリ/ urls.py -

from django.conf.urls import url 
from . import views 

urlpatterns = [ 
    url(r'^$', views.login, name='login'), 
    url(r'^register$', views.register, name='register'), 
    url(r'^client/items$', views.client_items, name='client_items'), 
    url(r'^client/new_item$', views.new_item, name='new_item'), 
    url(r'^client/edit_item$', views.edit_item, name='edit_item'), 
    url(r'^client/item_detail$', views.item_detail, name='item_detail'), 
] 

- 登録/ login.htmlと修正さ -

{% extends "registration/base.html" %} 

{% block content %} 

{% if form.errors %} 
<p>Your username and password didn't match. Please try again.</p> 
{% endif %} 

<form method="post" action=''>{% csrf_token %} 
    <label for="username">Username:</label> 
    <input type="text" name="username" value="" id="username"><br> 
    <label for="password">Password:</label> 
    <input type="password" name="password" value="" id="password"><br> 

    <input type="submit" value="Login" /> 
    <input type="hidden" name="next" value="{{ next }}" /> 
</form> 

{% endblock %} 
+0

if user is not None and user.is_active: auth.login(request, user) return HttpResponseRedirect("client/items") else: return HttpResponse("Invalid login. Please try again.") return render(request, "registration/login.html", {'next':'/client/items'}) 

あなたがPOSTリクエストでフォームを処理し、GET要求の場合には、ログインフォームを返す必要がありますが? –

+0

いいえ、ログインしていません! – allardbrain

+0

:)それはそれを修正しましたか? –

答えて

3

実行があるため、最後のreturnの文に到達したことがないようですifのいずれかの条件を満たしているか、そうでない場合はInvalid Loginという応答を返します。あなたはログインしている

def login(request, method='POST'): 
    '''Shows a login form and a registration link.''' 

    if request.method == 'POST': 
     username = request.POST.get('username', '') 
     password = request.POST.get('password', '') 
     user = auth.authenticate(username=username, password=password) 

     if user is not None and user.is_active: 
      auth.login(request, user) 
      return HttpResponseRedirect("client/items") 

     else: 
      return HttpResponse("Invalid login. Please try again.") 

    # if not POST then return login form  
    return render(request, "registration/login.html", {'next':'/client/items'}) 
+1

多くのありがとう、AKS!あなたは絶対に正しいです、私はPOST/GETの間の論理を区別するのを忘れました。これらの変更を加えたら、テンプレート(フォームを表示していたはずです)はまだ正しく表示されていなかったので、この原因となったHTMLファイルであると推測しました。確かに、ミラー化したHMTLの例はテンプレートを使用していましたが、私はテンプレートにフォームを渡していませんでした。 HTMLを書き直しただけで、ログインフォームが表示されます。 (私は今、困惑している無関係のエラーを取得しています。)改訂されたHTMLコードを投稿します。再度、感謝します! – allardbrain

関連する問題