gpt4 book ai didi

python - 自定义 Django 登录页面不呈现登录表单

转载 作者:太空宇宙 更新时间:2023-11-04 16:06:51 24 4
gpt4 key购买 nike

Django 新手在这里尝试创建自定义登录表单、 View 和模板。我的问题是我认为的逻辑导致表单不显示,相反,else 语句的错误消息总是出现。我确定我错过了什么,我只是不知道它是什么。谁能指出我正确的方向?我一直在使用 Django 文档和本教程:http://www.djangobook.com/en/2.0/chapter14.html谢谢!

更新:用户@AKS 指出我没有正确处理 POST/GET 逻辑,所以我接受了这个作为答案。一旦我调整了我的代码,表单仍然无法显示,所以我在 HTML 文件中发现了一些错误并修复了它们。更正后的代码显示在本文底部。

-- views.py --

# 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'})

-- 注册/登录.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 %}

-- 设置.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',
]

-- app/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 %}

最佳答案

似乎执行永远不会到达最后一个 return 语句,因为它要么满足 if 条件,要么返回 Invalid Login 响应。

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 请求的情况下返回登录表单:

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'})

关于python - 自定义 Django 登录页面不呈现登录表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37505957/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com