亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

django如何實現(xiàn)用戶的注冊、登錄、注銷功能

 更新時間:2025年01月20日 08:55:32   作者:_BooI  
本文詳細介紹了創(chuàng)建Django項目的步驟,包括配置數(shù)據(jù)庫、編寫用戶模型、創(chuàng)建遷移文件、編寫表單校驗、編寫前端頁面、編寫視圖類、編寫路由、使用Django自帶的管理后臺以及具體的文件結構,通過這些步驟,可以實現(xiàn)一個基本的Django項目

創(chuàng)建django項目的步驟:Django項目的創(chuàng)建步驟

一、前置工作

配置數(shù)據(jù)庫,設置數(shù)據(jù)庫引擎為mysql

1、在settings文件中找到DATABASES, 配置以下內(nèi)容

DATABASES = {
    "default": {
        'ENGINE': 'django.db.backends.mysql',  # 數(shù)據(jù)庫引擎
        'NAME': 'django_test',  # 連接的數(shù)據(jù)庫, 一定要存在
        'HOST': '127.0.0.1',  # mysql的ip地址, 這里是本地
        'PORT': 3306,  # mysql的默認端口
        'USER': 'root',  # mysql的用戶名
        'PASSWORD': 'xxx'  # mysql的密碼
    }
}

可能會提示以下內(nèi)容:

安裝即可: pip install mysqlclient -i https://pypi.tuna.tsinghua.edu.cn/simple

二、編寫用戶模型

django中使用ORM來存數(shù)據(jù)到數(shù)據(jù)庫

ORM模型(對象關系映射):

  • 一個 模型類對應數(shù)據(jù)庫中的一張表
  • 一個屬性對應數(shù)據(jù)庫中的一個字段

用戶表的字段:用戶名、密碼(可以自己擴展)

1、用戶模型

2、創(chuàng)建好模型后要執(zhí)行遷移數(shù)據(jù)的命令:

  • 生成遷移文件:python manage.py makemigrations
  • 遷移生效(同步到數(shù)據(jù)庫):python manage.py migrate

3、遷移成功后,migrations文件夾下會出現(xiàn)遷移文件,該文件記錄著模型的相關信息,001表示第一次遷移.

三、編寫表單校驗,以注冊表單校驗為例

使用django自帶的Form類來實現(xiàn)校驗

1、對字段的校驗,這里只截了用戶名的校驗,其他字段都差不多

2、對整個表單的校驗:

User需要從models.py文件中導入

3、form表單中自定義的其他方法:

四、編寫前端頁面,純html,文件寫在templates文件夾中

使用了模板的方式嵌入數(shù)據(jù)

超鏈接的跳轉連接:{% url "命名空間:路由的name值" %},有命名空間一定要標注命名空間,沒有則:{% url "路由的name值" %}

1、index.html

2、register.html

  • form.non_field_errors:表當校驗時,表單的錯誤,就是forms.py文件中的raise forms.ValidationError("錯誤信息")。
  • form.errors.username: 表單校驗時,用戶名的錯誤,就是forms.py文件中的error_messages信息,密碼校驗也是如此。

3、login.html

五、編寫視圖類來實現(xiàn)登錄、注冊功能

如果是get請求就執(zhí)行get方法,是post請求就執(zhí)行post方法,在form標簽中的methos方法中可以指定。

  • form.is_valid():用來校驗表單,校驗成功返回True, 失敗則返回False。
  • post的方法的實例化表單對象:實例化表單對象時一定要加request.POST,否則拿不到數(shù)據(jù)。
  • redirect: 重定向到其他視圖函數(shù)。
  • form對象:實例化表單對象,用來進行表單的各種存在,校驗,錯誤信息等待
  • request.session['username'] = request.POST['username']: 設置session值為用戶名(其他值也可以)

六、編寫首頁和注銷視圖函數(shù)

1、首頁函數(shù)

request.session.get():通過注冊時設置的session中來獲取用戶,通過這個判斷是否有登錄的用戶,可以與前端交互,有的話就顯示注銷,沒有的話顯示注冊和登錄

2、注銷函數(shù)

清除session值即可

七、編寫路由

1、在主路由中include分路由,并設置命名空間

命名空間:當有多個應用時建議用, 能更好的區(qū)分各個應用,使用namespace關鍵字設置

2、在app下創(chuàng)建一個urls.py文件,編寫以下內(nèi)容

注意:一定要加app_name, 視圖類一定要加.as_view()

八、django自帶的管理后臺

使用python manage.py createtsuperuser創(chuàng)建超級用戶

1、在admin.py文件中注冊模型

  • list_display:在后臺管理中要顯示的字段
  • admin.site.site_header:后臺管理的標題

2、在模型(models.py)中添加

3、使用注冊的超級用戶登錄

九、具體的文件

1、models.py

from django.db import models

class User(models.Model):
    # 定義變量,對應數(shù)據(jù)庫的表的字段
    # username參數(shù):參數(shù)1:后臺管理顯示的內(nèi)容,參數(shù)2:最大長度, CharField類型必須指定,參數(shù)3:不能為空,參數(shù)4:唯一
    username = models.CharField('用戶名', max_length=10, null=False, unique=True)
    password = models.CharField('密碼', max_length=255, null=False)
    # create_time參數(shù):參數(shù)2:記錄數(shù)據(jù)第一次創(chuàng)建的時間,自動記錄到數(shù)據(jù)庫
    create_time = models.DateTimeField('注冊時間', auto_now_add=True)

    # 設置后臺管理
    class Meta:
        app_label = 'app'  # 屬于那個app
        verbose_name = '用戶'
        verbose_name_plural = verbose_name

    # 輸出對象時用到的
    def __str__(self):
        return self.username

2、forms.py

from django import forms
from .models import User


class RegisterForm(forms.Form):
    # 用戶名
    username = forms.CharField(
        required=True,  # 不能為空,必須
        max_length=10,  # 最大長度
        min_length=4,  # 最小長度
        error_messages={
            'required': "不能為空",
            'max_length': "長度不能大于10",
            'min_length': "長度不能小于4",
        }
    )

    # 密碼
    password = forms.CharField(
        required=True,  # 不能為空,必須
        max_length=16,  # 最大長度
        min_length=8,  # 最小長度
        error_messages={
            'required': "不能為空",
            'max_length': "長度不能大于16",
            'min_length': "長度不能小于8",
        }
    )

    # 校驗
    def clean(self):
        # 獲取輸入的用戶名
        username = self.cleaned_data.get('username')

        user = User.objects.filter(username=username)  # 獲得一個查詢集,可以理解為一個列表
        # 用戶存在
        if user.exists():
            raise forms.ValidationError("用戶已存在")

        return self.cleaned_data

    # 存入數(shù)據(jù)庫
    def save(self):
        username = self.cleaned_data.get('username')
        password = self.cleaned_data.get('password')
        # 存入數(shù)據(jù)庫
        user = User(username=username, password=password)
        user.save()


class LoginForm(forms.Form):
    # 用戶名
    username = forms.CharField(
        required=True,  # 不能為空,必須
        max_length=10,  # 最大長度
        min_length=4,  # 最小長度
        error_messages={
            'required': "不能為空",
            'max_length': "長度不能大于10",
            'min_length': "長度不能小于4",
        }
    )

    # 密碼
    password = forms.CharField(
        required=True,  # 不能為空,必須
        max_length=16,  # 最大長度
        min_length=8,  # 最小長度
        error_messages={
            'required': "不能為空",
            'max_length': "長度不能大于16",
            'min_length': "長度不能小于8",
        }
    )

    # 校驗
    def clean(self):
        # 獲取輸入的信息
        username = self.cleaned_data.get('username')
        password = self.cleaned_data.get('password')
        user = User.objects.filter(username=username)  # 獲得一個查詢集,可以理解為一個列表
        if user.exists():
            if user[0].password != password:
                raise forms.ValidationError("密碼錯誤")
        else:
            raise forms.ValidationError("用戶不存在")

        return self.cleaned_data

3、admin.py

from django.contrib import admin
from .models import User


# Register your models here.
@admin.register(User)
class UserAdmin(admin.ModelAdmin):
    list_display = ['id', 'username', 'create_time']


admin.site.site_header = 'django后臺管理'

4、views.py

from django.shortcuts import render, HttpResponse, redirect
from django.views import View
from .models import User
from .forms import RegisterForm, LoginForm


# Create your views here.

def index(request):
    username = request.session.get('username', default=0)  # 通過session獲取用戶名,給默認值防止報錯
    user = User.objects.filter(username=username).first()
    return render(request, 'index.html', {'user': user})


class RegisterView(View):
    def get(self, request):
        form = RegisterForm()
        return render(request, 'register.html', {'form': form})

    def post(self, request):
        form = RegisterForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('app:login')
        return render(request, 'register.html', {'form': form})


class LoginView(View):
    def get(self, request):
        form = LoginForm()
        return render(request, 'login.html', {'form': form})

    def post(self, request):
        form = LoginForm(request.POST)
        print("登錄")
        if form.is_valid():
            # 設置session
            request.session['username'] = request.POST['username']
            return redirect('app:index')
        return render(request, 'login.html', {'form': form})


# 注銷
def Logout(request):
    request.session.clear()  # 清除session
    return redirect('app:index')

5、app中的urls.py

from django.urls import path
from .views import *

app_name = 'app'

urlpatterns = [
    path('', index, name='index'),  # 首頁

    path('register/', RegisterView.as_view(), name='register'),  # 注冊

    path('login/', LoginView.as_view(), name='login'),  # 登錄

    path('logout', Logout, name='logout'),  # 注銷
]

6、主路由urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path("admin/", admin.site.urls),
    path('', include('app.urls', namespace='app'))
]

7、index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首頁</title>
</head>
<body>

{% if user %}
	<h1>歡迎{{ user.username }}進入首頁?。?!</h1>
    <a href="{% url 'app:logout' %}" rel="external nofollow" >注銷</a>
{% else %}
    <h1>請注冊或登錄</h1>
    <a href="{% url 'app:register' %}" rel="external nofollow"  rel="external nofollow" >注冊</a>
    <a href="{% url 'app:login' %}" rel="external nofollow"  rel="external nofollow" >登錄</a>
{% endif %}

</body>
</html>

8、register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注冊</title>
</head>
<body>
<h3>注冊</h3>
<a href="{% url 'app:login' %}" rel="external nofollow"  rel="external nofollow" >登錄</a>|
<a href="{% url 'app:index' %}" rel="external nofollow"  rel="external nofollow" >首頁</a>
<form action="{% url 'app:register'  %}" method="post">
    {% csrf_token %}

    <div><p style="color: red">{{ form.non_field_errors  }}</p></div>

    <div>
        <lable>用戶名</lable>
        <label>
            <input type="text" name="username">
        </label>
        <p style="color: red">{{ form.errors.username }}</p>
    </div>

    <div>
        <lable>密碼</lable>
        <label>
            <input type="password" name="password">
            <p style="color: red">{{ form.errors.password }}</p>
        </label>
    </div>
    <button type="submit">注冊</button>
</form>
</body>


</html>

9、login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登錄</title>
</head>
<body>
<h3>登錄</h3>
<a href="{% url 'app:register' %}" rel="external nofollow"  rel="external nofollow" >注冊</a>|
<a href="{% url 'app:index' %}" rel="external nofollow"  rel="external nofollow" >首頁</a>
<form action="{% url 'app:login'  %}" method="post">
    {% csrf_token %}
    <div><p style="color: red">{{ form.non_field_errors  }}</p></div>
    <div>
        <lable>用戶名</lable>
        <label>
            <input type="text" name="username">
            <p style="color: red">{{ form.errors.username }}</p>
        </label>
    </div>

    <div>
        <lable>密碼</lable>
        <label>
            <input type="password" name="password">
            <p style="color: red">{{ form.errors.password }}</p>
        </label>
    </div>
    <button>登錄</button>
</form>

</body>
</html>

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Python通過yagmail實現(xiàn)發(fā)送郵件代碼解析

    Python通過yagmail實現(xiàn)發(fā)送郵件代碼解析

    這篇文章主要介紹了Python通過yagmail實現(xiàn)發(fā)送郵件代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • Python實現(xiàn)base64編碼

    Python實現(xiàn)base64編碼

    這篇文章介紹了Python實現(xiàn)base64編碼的方法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • 詳解python中init方法和隨機數(shù)方法

    詳解python中init方法和隨機數(shù)方法

    這篇文章主要介紹了python中init方法和隨機數(shù)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • 淺談tensorflow 中tf.concat()的使用

    淺談tensorflow 中tf.concat()的使用

    今天小編就為大家分享一篇淺談tensorflow 中tf.concat()的使用,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python logging簡介詳解

    Python logging簡介詳解

    這篇文章主要介紹了Python日志模塊logging簡介,本文講解了Logger、Handler、Formatter、日志配置管理、通過文件配置管理日志等內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 在Linux下使用命令行安裝Python

    在Linux下使用命令行安裝Python

    這篇文章主要介紹了在Linux下使用命令行安裝Python,通過詳細的圖文介紹Linux安裝Python的全部過程,希望對你有所幫助
    2021-06-06
  • Python自定義函數(shù)的創(chuàng)建、調(diào)用和函數(shù)的參數(shù)詳解

    Python自定義函數(shù)的創(chuàng)建、調(diào)用和函數(shù)的參數(shù)詳解

    這篇文章主要介紹了Python自定義函數(shù)的創(chuàng)建、調(diào)用和函數(shù)的參數(shù)、變量作用域等常見問題,需要的朋友可以參考下
    2014-03-03
  • Pygame Draw繪圖函數(shù)的具體使用

    Pygame Draw繪圖函數(shù)的具體使用

    Pygame 中提供了一個draw模塊用來繪制一些簡單的圖形狀,比如矩形、多邊形、圓形、直線、弧線等,本文就詳細的介紹一下如何使用
    2021-11-11
  • 使用 Python 實現(xiàn)文件遞歸遍歷的三種方式

    使用 Python 實現(xiàn)文件遞歸遍歷的三種方式

    這篇文章主要介紹了使用 Python 實現(xiàn)文件遞歸遍歷的三種方式,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-07-07
  • pytorch之torchvision.transforms圖像變換實例

    pytorch之torchvision.transforms圖像變換實例

    今天小編就為大家分享一篇pytorch之torchvision.transforms圖像變換實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12

最新評論