关键词

django实现用户登陆功能详解

下面详细讲解“Django实现用户登录功能”的完整攻略:

1. 创建Django项目

首先,我们需要先创建一个Django项目。在命令行中执行如下命令:

django-admin startproject myproject

这将会创建一个名为 "myproject" 的Django项目。

2. 创建应用

接下来,我们需要创建一个应用,用来实现用户登录功能。在命令行中执行如下命令:

python manage.py startapp login

这将会创建一个名为 "login" 的Django应用。

3. 创建用户模型

创建用户模型可以使用 Django 内置的AbstractBaseUserAbstractUser类,这里我们使用 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 类,并自定义了表单的 labelwidget,用来渲染表单的样式。

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实现用户登录功能”的完整攻略。希望对你有所帮助!

本文链接:http://task.lmcjl.com/news/15479.html

展开阅读全文