我正在尝试将一些登录数据传递到Django应用程序中的视图,但我没有获得视图的POST数据。首先是带登录界面的模板。
<form method="post" action="login">
{% csrf_token %}
Username<input type="text" name="username"><br />
Password<input type="password" name="password"><br />
<input type="submit" value="Login" />
</form>
接下来,我将此传递给我的登录视图,该视图在我的views.py中定义如下,这是问题发生的地方。
from django.contrib.auth import authenticate, login
def login(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
#logic with directing user to the login page again or to the access they need
在我尝试分配给用户名变量的行上,我收到错误:
MultiValueDictKeyError at /minion/login
"Key 'username' not found in <Querydict: {}>"
Request Method: GET
Request URL: http://127.0.0.1:8000/minion/login
Django Version: 1.5.1
奇怪的是,在页面的“请求信息”部分中,它表示没有POST信息或GET信息。我不确定A.为什么它说请求方法是GET,因为我在模板和B中指定了POST。为什么没有POST或GET数据。如果有人知道我在Django / Python中使用POST数据可能会缺少的东西,或者需要另一条信息,那就太棒了。提前感谢您的帮助。
编辑:一些进展。 我通过放入完整路径设法让页面通过第一个建议的反向错误加载。此时我的问题的关键在于弄清楚如何使表单数据作为POST而不是GET进入视图函数。编辑:这是我在应用程序目录中的urls.py文件
from django.conf.urls import patterns, include, url
urlpatterns = patterns('Minion.views',
url(r'^$', 'home'),
url(r'^login/$', 'login'),
#some other unrelated pages are here, I haven't done anything with them yet though
)
答案 0 :(得分:5)
您正在被重定向。
您的表单操作(即目标)仅为login
。但Django的默认配置是使用最终斜杠结束所有URL,如果URL不这样做则重定向:因此浏览器将从/login
重定向到/login/
。重定向始终是GET,因此POST数据会丢失。
使用action="/login/"
,一切都会好的。
答案 1 :(得分:2)
似乎您有GET请求而不是POST或
之前或之后Request Method: GET
Request URL: http://127.0.0.1:8000/minion/login
我认为您应该检查请求方法
from django.contrib.auth import authenticate, login
def login(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
# otherwise create page with form or redirect
有可能POST请求是意外的并且是通过某种重定向完成的(例如没有尾随斜杠会导致重定向)你应该关心这种情况。
答案 2 :(得分:1)
将操作更改为“{%'Minion.views.authUser'%}并将视图功能更改为authUser,因为它与auth模块中导入的登录功能冲突,一切正常。
答案 3 :(得分:0)
试试这个,它会在你的views.py
中有效from django.contrib.auth import authenticate, login
def login(request):
if request.method == 'POST':
data = request.POST
username = data['username']
password = data['password']
user = authenticate(username=username, password=password)