tengke 发表于 2023-5-22 10:19:01

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信息



isdkz 发表于 2023-5-22 10:19:02

你在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">登录

isdkz 发表于 2023-5-22 11:13:00

你在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]
查看完整版本: web界面登陆错误