我想为我的应用程序编写一个简单的登录表单。这只是一种简单的形式,它通过发布请求将数据发送到django服务器。 为了进行身份验证,我必须访问django文档中提到的发帖请求数据,但这不能正常工作。
这是我的html表单:
<form method="POST" action="/login/">{% csrf_token %}
<div class="form-group">
<label for="ID">User</label>
<input type="text" class="form-control" id="ID" aria-describedby="User" placeholder="Username">
</div>
<div class="form-group">
<label for="password">Passwort</label>
<input type="password" class="form-control" id="password" laceholder="Passwort">
</div>
<button type="submit" class="btn btn-primary">Einloggen</button>
</form>
这是我的django代码:
def get_access(request):
if request.method == 'POST':
username = request.POST['ID']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
我收到此错误:
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/login/
Django Version: 2.1.7
Python Version: 3.7.3
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'App',
'rest_framework',
'rest_framework.authtoken']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback:
File "C:\Users\felix\DEV\my_env\lib\site-packages\django\utils\datastructures.py" in __getitem__
77. list_ = super().__getitem__(key)
During handling of the above exception ('ID'), another exception occurred:
File "C:\Users\felix\DEV\my_env\lib\site-packages\django\core\handlers\exception.py" in inner
34. response = get_response(request)
File "C:\Users\felix\DEV\my_env\lib\site-packages\django\core\handlers\base.py" in _get_response
126. response = self.process_exception_by_middleware(e, request)
File "C:\Users\felix\DEV\my_env\lib\site-packages\django\core\handlers\base.py" in _get_response
124. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\felix\DEV\my_env\Animoo\App\views.py" in get_access
163. username = request.POST['ID']
File "C:\Users\felix\DEV\my_env\lib\site-packages\django\utils\datastructures.py" in __getitem__
79. raise MultiValueDictKeyError(key)
Exception Type: MultiValueDictKeyError at /login/
Exception Value: 'ID'
你能帮我吗?
答案 0 :(得分:1)
HTML表单使用name=...
[html.com]属性创建键值对,而不是 的键值对。因此,您应该按照文档中的说明指定名称:id=...
指定输入元素的名称。提交表单时,每个输入元素的名称和值都包含在HTTP请求中。
因此,您应该添加name
属性,例如:
<form method="POST" action="/login/">{% csrf_token %}
<div class="form-group">
<label for="ID">User</label>
<input name="ID" type="text" class="form-control" id="ID" aria-describedby="User" placeholder="Username">
</div>
<div class="form-group">
<label for="password">Passwort</label>
<input name="password" type="password" class="form-control" id="password" laceholder="Passwort">
</div>
<button type="submit" class="btn btn-primary">Einloggen</button>
</form>
id=...
用于标识DOM中的对象,例如使用JavaScript等动态更改HTML内容。因此,您仍然可以保留id="..."
属性,但是在提交表单时该属性不起作用。