web界面登陆错误
本帖最后由 tengke 于 2023-5-22 14:47 编辑html界面数据信息——————————
————————————————————————————————
{% csrf_token %}
<div class="login">
<div class="header">登录</div>
<div class="container">
<input type="username" placeholder="请输入用户名">
<span class="left"></span>
<span class="right"></span>
<span class="top"></span>
<span class="bottom"></span>
<span> {% for error in form.non_field_errors %}
{{ error|escape }}
{% endfor %}</span>
</div>
<div class="container1">
<input type="password" placeholder="请输入密码">
<span class="left"></span>
<span class="right"></span>
<span class="top"></span>
<span class="bottom"></span>
<span> {% for error in form.non_field_errors %}
{{ error|escape }}
{% endfor %}</span>
</div>
<button class="btn" type="submit">登录</button>
</div>
</body>
</html>
————————————————————
py数据信息
from django.shortcuts import render
from django import forms
from app import models
class Logina(forms.Form):
username= forms.CharField(label="用户名",
widget=forms.TextInput)
password =forms.CharField(label="密码",
widget=forms.PasswordInput)
def login(request):
if request.method == "GET":
form = Logina()
return render(request,"dl.html")
form = login(data=request.POST)
if form.is_valid():
cleaned_data = super().clean()
print(cleaned_data)
return render(request, "dl.html")
前台点击登陆按钮不能正常的登陆 后台也没有 post数据只有get信息
你在Django视图中创建的表单处理方式似乎有一些问题,导致了登录失败。此外,HTML模板中也缺少了一些必要的元素。以下是我建议的修复方式:
**Python 代码部分:**
1. 在处理 POST 请求时,你应该使用你定义的Logina表单,而不是login 。 login是你的视图函数,而不是一个表单。应该将form = login(data=request.POST)更改为form = Logina(request.POST) 。
2.super().clean()是在 Django 的Form或ModelForm的子类中使用的。它并不应该在你的视图函数中使用。如果你希望在表单有效时清洁你的数据,你应该在Logina表单类中实现这个方法。
3. 你需要检查用户名和密码是否正确。你可以在Logina表单中添加一个clean方法来进行这种检查。
4. 你需要处理表单提交。通常,你会将表单放在<form>标签中,并设置action属性指向处理 POST 请求的视图。
以下是修改后的 Python 代码:
from django.shortcuts import render, redirect
from django import forms
from django.contrib.auth import authenticate, login
class Logina(forms.Form):
username = forms.CharField(label="用户名", widget=forms.TextInput)
password = forms.CharField(label="密码", widget=forms.PasswordInput)
def clean(self):
cleaned_data = super().clean()
username = cleaned_data.get("username")
password = cleaned_data.get("password")
user = authenticate(username=username, password=password)
if user is None:
raise forms.ValidationError("无效的用户名或密码")
return cleaned_data
def login_view(request):
if request.method == "GET":
form = Logina()
return render(request, "dl.html", {'form': form})
else:
form = Logina(request.POST)
if form.is_valid():
username = form.cleaned_data.get("username")
password = form.cleaned_data.get("password")
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
return redirect('/')# Change this to where you want to redirect after login
return render(request, "dl.html", {'form': form})
注意,我更改了视图名称为login_view ,以避免与django.contrib.auth.login冲突。
**HTML 模板部分:**
1. 你需要一个<form>标签来包裹你的输入框和按钮,并设置action和method属性。
2. 你需要用 Django 的模板标签 {{ }} 来渲染表单。
3. 我注意到你尝试显示非字段错误,但是你在每个输入框下都显示了这些错误。这可能会导致错误消息被重复显示。我建议你只在表单的顶部或底部显示这些错误。
这是修改后的 HTML 模板:
```html
<body>
<form method="post" action="{% url 'login' %}">{% csrf_token %}
<div class="login">
<div class="header">登录 你在Django视图中创建的表单处理方式似乎有一些问题,导致了登录失败。此外,HTML模板中也缺少了一些必要的元素。以下是我建议的修复方式:
**Python 代码部分:**
1. 在处理 POST 请求时,你应该使用你定义的Logina表单,而不是login 。 login是你的视图函数,而不是一个表单。应该将form = login(data=request.POST)更改为form = Logina(request.POST) 。
2.super().clean()是在 Django 的Form或ModelForm的子类中使用的。它并不应该在你的视图函数中使用。如果你希望在表单有效时清洁你的数据,你应该在Logina表单类中实现这个方法。
3. 你需要检查用户名和密码是否正确。你可以在Logina表单中添加一个clean方法来进行这种检查。
4. 你需要处理表单提交。通常,你会将表单放在<form>标签中,并设置action属性指向处理 POST 请求的视图。
以下是修改后的 Python 代码:
from django.shortcuts import render, redirect
from django import forms
from django.contrib.auth import authenticate, login
class Logina(forms.Form):
username = forms.CharField(label="用户名", widget=forms.TextInput)
password = forms.CharField(label="密码", widget=forms.PasswordInput)
def clean(self):
cleaned_data = super().clean()
username = cleaned_data.get("username")
password = cleaned_data.get("password")
user = authenticate(username=username, password=password)
if user is None:
raise forms.ValidationError("无效的用户名或密码")
return cleaned_data
def login_view(request):
if request.method == "GET":
form = Logina()
return render(request, "dl.html", {'form': form})
else:
form = Logina(request.POST)
if form.is_valid():
username = form.cleaned_data.get("username")
password = form.cleaned_data.get("password")
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
return redirect('/')# Change this to where you want to redirect after login
return render(request, "dl.html", {'form': form})
注意,我更改了视图名称为login_view ,以避免与django.contrib.auth.login冲突。
**HTML 模板部分:**
1. 你需要一个<form>标签来包裹你的输入框和按钮,并设置action和method属性。
2. 你需要用 Django 的模板标签 {{ }} 来渲染表单。
3. 我注意到你尝试显示非字段错误,但是你在每个输入框下都显示了这些错误。这可能会导致错误消息被重复显示。我建议你只在表单的顶部或底部显示这些错误。
这是修改后的 HTML 模板:
<body>
<form method="post" action="{% url 'login' %}">{% csrf_token %}
<div class="login">
<div class="header">登录
</div>
<div class="container">
{{ form.username }}
<span class="left"></span>
<span class="right"></span>
<span class="top"></span>
<span class="bottom"></span>
</div>
<div class="container1">
{{ form.password }}
<span class="left"></span>
<span class="right"></span>
<span class="top"></span>
<span class="bottom"></span>
</div>
<button class="btn" type="submit">登录</button>
</div>
{% for error in form.non_field_errors %}
<div>{{ error|escape }}</div>
{% endfor %}
</form>
</body>
请注意将{% url 'login' %}更改为正确的 URL。如果你在urls.py中使用了不同的名称,需要修改这个部分。
希望这些信息对你有所帮助。如果你在实施这些更改时遇到任何问题,或者有其他的问题,欢迎继续提问。
页:
[1]