django用户注册、登录、注销和用户扩展的示例

让我来详细讲解一下关于“Django用户注册、登录、注销和用户扩展的示例”的攻略。

概述

在Django中,用户认证是开箱即用的,也就是说你可以方便地创建用户账户、实现登录认证等操作。本攻略将介绍基本的Django用户认证流程,以及如何通过扩展用户模型的方法增加字段来完成用户注册和登录的过程。

本文涉及到的环境以及版本信息如下:

  • Python 3.7.9
  • Django 3.1.2

示例一:用户注册和登录

1. 创建Django项目和应用

首先通过Django提供的命令创建项目和应用:

$ django-admin startproject mysite
$ cd mysite
$ python manage.py startapp accounts

其中,mysite是项目名称,accounts是应用名称。

2. 设置数据库

在Django中,我们需要先设置数据库。在mysite/settings.py文件中,找到DATABASES字段,并按照自己的需求进行设置。

# mysite/settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

上述配置使用SQLite作为数据库,并将数据库文件保存在项目根目录下的db.sqlite3文件中。

3. 创建用户模型

在Django中,用户模型已经被封装成了django.contrib.auth.models.User模型。但如果仅仅是使用这个默认的用户模型,可能会存在一些限制。因此,我们通常需要对用户模型进行扩展。

以下是示例中的用户模型:

# accounts/models.py

from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    nickname = models.CharField(max_length=50, blank=True)
    avatar = models.ImageField(upload_to='avatars', null=True, blank=True)

在这个扩展后的用户模型中,我们添加了两个字段,分别是用户昵称和用户头像。

4. 配置Django认证系统

在Django中,系统默认使用django.contrib.auth中的认证系统。我们需要在mysite/settings.py文件中设置一些参数来启用认证系统。

# mysite/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'accounts',  # 加入此应用
]

# 设置认证后端为django.contrib.auth.backends.ModelBackend
AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
]

# 设置用户模型为accounts.models.User
AUTH_USER_MODEL = 'accounts.User'

其中,AUTHENTICATION_BACKENDS用于设置认证后端,AUTH_USER_MODEL用于指定用户模型。

5. 创建用户注册和登录视图

接下来,我们需要创建用户注册与登录的视图,并编写相应的html模板。以下是示例中的代码:

# accounts/views.py

from django.shortcuts import render, redirect
from django.contrib.auth import login, authenticate
from django.contrib.auth.forms import AuthenticationForm
from .forms import UserCreationForm

def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST, request.FILES)
        if form.is_valid():
            new_user = form.save(commit=False)
            new_user.set_password(form.cleaned_data['password1'])
            new_user.save()
            return redirect('login')
    else:
        form = UserCreationForm()
    return render(request, 'accounts/register.html', {'form': form})

def user_login(request):
    if request.method == 'POST':
        form = AuthenticationForm(data=request.POST)
        if form.is_valid():
            user = authenticate(username=form.cleaned_data['username'],
                                password=form.cleaned_data['password'])
            if user is not None:
                login(request, user)
                return redirect('/')
    else:
        form = AuthenticationForm()
    return render(request, 'accounts/login.html', {'form': form})
<!-- accounts/templates/accounts/register.html -->

{% extends 'base.html' %}

{% block content %}
  <h2>注册</h2>
  <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">注册</button>
  </form>
{% endblock %}
<!-- accounts/templates/accounts/login.html -->

{% extends 'base.html' %}

{% block content %}
  <h2>登录</h2>
  <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">登录</button>
  </form>
{% endblock %}

在上面的代码中,accounts/forms.py定义了UserCreationForm表单,用于处理用户注册时的表单数据。accounts/templates/accounts/register.html是用户注册的html页面,以及登录页面的html表示。

6. URL配置

最后,我们需要在mysite/urls.py文件中配置视图对应的URL。

# mysite/urls.py

from django.contrib import admin
from django.urls import path, include
from django.conf.urls.static import static
from django.conf import settings
from accounts.views import register, user_login

urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/login/', user_login, name='login'),
    path('accounts/register/', register, name='register'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

现在,用户认证系统就配置完成了。在浏览器中访问http://127.0.0.1:8000/accounts/register/即可进行用户注册,访问http://127.0.0.1:8000/accounts/login/即可进行用户登录。

示例二:UserProfile扩展

1. 创建UserProfile模型

扩展Django用户模型的方法有很多,本示例中将使用OneToOneField模型来扩展用户模型,即在已有的用户模型基础上创建一个一对一的用户信息模型。

# accounts/models.py

from django.db import models
from django.contrib.auth.models import AbstractUser

class UserProfile(models.Model):
    user = models.OneToOneField(
        AbstractUser,
        on_delete=models.CASCADE,
        related_name='profile'
    )
    nickname = models.CharField(max_length=50, blank=True)
    avatar = models.ImageField(upload_to='avatars', null=True, blank=True)

    def __str__(self):
        return f'{self.user.username}的信息'

在这个示例中,我们新建一个UserProfile模型,并使用OneToOneField与User模型建立一对一的关系,用来存储额外的用户信息。

2. 创建UserProfile表单

accounts/forms.py 文件中,定义一个用于修改UserProfile表单的类。

# accounts/forms.py

from django import forms
from .models import UserProfile

class UserProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = ['nickname', 'avatar']
        widgets = {
            'avatar': forms.FileInput(attrs={'class': 'custom-file-input'}),
        }

在这个表单中,我们将UserProfile模型中的nickname和avatar字段放在了表单中,并对头像文件添加了样式。

3. 创建UserProfile视图

accounts/views.py 文件中,定义 profile 视图,用于展示和更新用户的 UserProfile

# accounts/views.py

from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from .models import UserProfile
from .forms import UserProfileForm

@login_required(login_url='/accounts/login/')
def profile(request):
    if request.method == 'POST':
        profile_form = UserProfileForm(request.POST, request.FILES,
                                        instance=request.user.profile)
        if profile_form.is_valid():
            profile_form.save()
            return redirect('profile')
    else:
        profile_form = UserProfileForm(instance=request.user.profile)
    return render(request, 'accounts/profile.html', {'profile_form': profile_form})

在这个视图中,我们使用 login_required 装饰器保证只有登录的用户才能访问个人信息的页面。在 POST 请求的情况下,我们通过读取 request.FILES 来处理上传文件,并将更新过的 UserProfileForm 保存到数据库。

4. 创建UserProfile的URL

mysite/urls.py 文件中加入如下一行代码:

# mysite/urls.py

urlpatterns = [
    # ...
    path('accounts/profile/', profile, name='profile'),
]

5. 创建UserProfile的模板

accounts/templates/accounts/ 目录下新建 profile.html,并编写如下代码:

{% extends 'base.html' %}

{% block content %}
  <h2>个人信息</h2>
  <p><a href="{% url 'logout' %}">退出</a></p>
  <form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ profile_form.as_p }}
    <div class="form-group">
      <button type="submit" class="btn btn-primary">保存</button>
    </div>
  </form>
{% endblock %}

在上面的代码中,我们通过 {% url 'logout' %} 将用户退出的链接与内建的 Django URL 匹配。

6. 配置media

由于上传的文件需要保存到服务器上,所以我们需要在 mysite/settings.py 上添加如下配置:

# mysite/settings.py

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')  # 指定文件存储路径
MEDIA_URL = '/media/'  # 指定在url中的前缀,如 /media/test.png

在项目根目录中新建一个 media/ 目录,所有上传的文件都将存放在这个目录中。

至此,我们已经完成了UserProfile的扩展,可以在浏览器中访问 http://127.0.0.1:8000/accounts/profile/ 来设置个人信息,同时也可以在我们的用户注册视图中添加更多的信息。

以上就是Django用户注册、登录、注销和用户扩展的示例攻略,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django用户注册、登录、注销和用户扩展的示例 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • django rest framework 实现用户登录认证详解

    下面我就为您详细讲解“django rest framework 实现用户登录认证详解”的完整攻略,包含两条示例说明。 一、什么是Django Rest Framework Django Rest Framework是一个快速而灵活的Web框架,用于构建API。它使用了 Django 的优点,例如轻松的数据库管理、简单的URL路由、强大的视图和模板引擎,并将…

    Django 2023年5月16日
    00
  • django解决订单并发问题【推荐】

    以下是对django解决订单并发问题的完整攻略: 核心原理 Django解决并发问题的核心原理是通过数据库的事务机制来保证数据的一致性。当一个用户对某个数据进行操作时,Django会在数据库层面对数据进行锁定,使得其他用户不能同时对该数据进行操作。在用户完成操作后,Django会释放该锁。这样就可以避免多个用户同时对同一个数据进行操作,导致数据不一致的问题。…

    Django 2023年5月16日
    00
  • Django—ajax

    知识点复习: Python序列化 字符串 = json.dumps(对象) 对象->字符串 对象 = json.loads(字符串) 字符串->对象 JavaScript: 字符串 = JSON.stringify(对象) 对象->字符串 对象 = JSON.parse(字符串) 字符串->对象 应用场景: 数据传输时, 发送:字符串…

    Django 2023年4月12日
    00
  • Django基础知识 URL路由系统详解

    Django基础知识:URL路由系统详解 一、URL路由系统简介 在Django中,URL路由系统是用于匹配URL并将请求分发给适当的视图函数的机制,它可以让我们轻松地将不同的请求分发到不同的视图函数中,从而实现动态路由和URL处理。 URL路由系统有以下几个重要的组件: urls.py:路由器的配置文件,用于指定将URL映射到处理请求逻辑的视图函数。 re…

    Django 2023年5月16日
    00
  • Django 中related_name,”%(app_label)s_%(class)s_related”

    先看个model   1 from django.db import models 2 3 # Create your models here. 4 5 6 class Parent(models.Model): 7 name = models.CharField(max_length=64, verbose_name=u’姓名’) 8 id_num = m…

    Django 2023年4月11日
    00
  • django 读取图片到页面实例

    下面是详细的“Django 读取图片到页面实例”的攻略,包含两个示例说明。 1. 示例1:读取静态文件夹中的图片到页面 在 Django 项目的 settings.py 中添加以下设置,指定项目中的静态文件夹路径: STATIC_URL = ‘/static/’ STATICFILES_DIRS = [ os.path.join(BASE_DIR, &quo…

    Django 2023年5月16日
    00
  • Django – 权限(2)- 动态显示单级权限菜单

    一、权限组件 1、上篇随笔中,我们只是设计好了权限控制的表结构,有三个模型,五张表,两个多对多关系,并且简单实现了对用户的权限控制,我们会发现那样写有一个问题,就是权限控制写死在了项目中,并且没有实现与我们的业务逻辑解耦,当其他项目要使用权限控制时,要再重复写一遍权限控制的代码,因此我们很有必要将权限控制的功能开发成一个组件(可插拔)。   组件其实就是一个…

    Django 2023年4月10日
    00
  • django中render()与render_to_response()区别

    render()与render_to_response()均是django中用来显示模板页面的,但是在django1.3之后,render()便比render_to_response()更加招人待见!最明显的就是前者会自动使用RequestContext,而后者需要coding进去,例如: render(request,’share.html’, {‘reg…

    Django 2023年4月11日
    00
合作推广
合作推广
分享本页
返回顶部