下面详细讲解“Django实现用户登录功能”的完整攻略:
1. 创建Django项目
首先,我们需要先创建一个Django项目。在命令行中执行如下命令:
django-admin startproject myproject
这将会创建一个名为 "myproject" 的Django项目。
2. 创建应用
接下来,我们需要创建一个应用,用来实现用户登录功能。在命令行中执行如下命令:
python manage.py startapp login
这将会创建一个名为 "login" 的Django应用。
3. 创建用户模型
创建用户模型可以使用 Django 内置的AbstractBaseUser
或AbstractUser
类,这里我们使用 AbstractUser
类。
在 login/models.py
中添加如下代码:
from django.contrib.auth.models import AbstractUser
class User(AbstractBaseUser):
username = models.CharField(max_length=40, unique=True)
email = models.EmailField(unique=True)
password = models.CharField(max_length=128)
...
USERNAME_FIELD = 'username'
class Meta:
verbose_name_plural = 'Users'
def __str__(self):
return self.username
这里我们自定义了用户模型,包含了用户名、邮箱和密码等字段,同时继承了 Django 的 AbstractUser
类。我们还设置了USERNAME_FIELD
属性为"username",表示我们使用用户名来作为登录的唯一标识。
4. 创建用户表单
在 login/forms.py
中添加如下代码:
from django import forms
from django.contrib.auth.forms import AuthenticationForm
class LoginForm(AuthenticationForm):
username = forms.CharField(label='用户名', max_length=40)
password = forms.CharField(label='密码', widget=forms.PasswordInput)
class Meta:
fields = ('username', 'password')
我们继承了 Django 自带的 AuthenticationForm
类,并自定义了表单的 label
和 widget
,用来渲染表单的样式。
5. 创建登录视图
在 login/views.py
中添加如下代码:
from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect
from .forms import LoginForm
def user_login(request):
if request.method == 'POST':
form = LoginForm(request, data=request.POST)
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return redirect('home')
else:
form.add_error('username', '用户名或密码错误')
else:
form = LoginForm()
return render(request, 'login/login.html', {'form': form})
这里我们创建了一个登录视图函数,接收用户提交的表单数据进行验证,并调用 Django 内置的 authenticate
方法进行身份验证,如果通过验证,则调用 Django 内置的 login
方法登录用户。
同时,我们在 render
函数中返回了 login.html
模板,并将表单数据 form
传递给了模板,用来渲染表单。
6. 创建登录模板
在 login/templates/login/login.html
中添加如下代码:
{% extends 'base.html' %}
{% block content %}
<h1>用户登录</h1>
<form method="post">
{% csrf_token %}
{{ form.username.label_tag }}
{{ form.username }}
{{ form.password.label_tag }}
{{ form.password }}
{{ form.errors }}
<button type="submit">登录</button>
</form>
{% endblock %}
这里我们在模板中使用 Django 内置的模板语言来渲染表单,使用了 {{ form.username }}
和 {{ form.password }}
来渲染表单的输入框,使用了 {{ form.errors }}
来渲染表单的错误信息。
示例说明1
在登录视图中,我们使用了LoginForm
来验证用户输入的信息。为了防止用户随意输入其他属性,导致信息泄露,我们在LoginForm
中添加Meta属性,指定了需要传入的属性。
class LoginForm(AuthenticationForm):
username = forms.CharField(label='用户名', max_length=40)
password = forms.CharField(label='密码', widget=forms.PasswordInput)
class Meta:
fields = ('username', 'password')
示例说明2
在用户模型中,我们使用了AbstractUser
类,继承该类之后,我们只需加入自定义的属性即可。
from django.contrib.auth.models import AbstractUser
class User(AbstractBaseUser):
username = models.CharField(max_length=40, unique=True)
email = models.EmailField(unique=True)
password = models.CharField(max_length=128)
...
USERNAME_FIELD = 'username'
class Meta:
verbose_name_plural = 'Users'
def __str__(self):
return self.username
继承AbstractUser
类后,Django会自动为我们创建了许多内置的模型方法和管理员权限。同时,由于我们添加了USERNAME_FIELD
属性,Django会自动将该属性作为用于检查的唯一标识。
以上就是“Django实现用户登录功能”的完整攻略。希望对你有所帮助!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django实现用户登陆功能详解 - Python技术站