从零开始做个人网站(1)

写在前面:

由于作者仅仅是自学,且是独自做这个项目,代码中出现不少漏洞、错误、累赘或常识问题是难免的,作者也在不断努力学习中,请各位看官多提意见,轻喷~


基本信息

1. 项目环境

Python 3.10.7

Django 4.2

编辑器:VSCode

操作系统:Windows 10

2. 项目背景

正好近一段时间在自学 Django,突发奇想不妨试着做个个人网站练练手吧~

3. 项目构思

暂定为:登录系统 + 个人主页 + 个人博客 + 个人作品


项目代码

今天的任务是做完登录系统的模型 ~

1. 新建项目

(本文默认 Python, Django 等都已安装完毕)

找一个合适的地址,打开 cmd,输入

django-admin startproject 你的项目名称

这里我的项目名称是 LZLBlog

刚创建的项目结构如下 ——

此时可以在 cmd 中输入

python manage.py runserver

 接着可以看到下面的提示,这说明 Django 的开发服务器已经开始提供Web服务了 ~

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
July 25, 2023 - 11:43:00
Django version 4.2, using settings 'LZLBlog.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

 打开浏览器,输入 http://127.0.0.1:8000/ ,如果你看到如下界面,那么准备工作就正确完成啦

2. 新建应用

打开 cmd,输入

django-admin startapp 你的应用名称

这里因为是登录系统,所以我的应用名称是 login

注意:一定要在 刚才新建的项目文件夹中 新建应用!

新建后项目目录如下 ——

3. 创建模型

 首先,作为一个登录系统,用户模型是必不可少的,因此我们先把用户模型写好

打开 LZLBlog/login/models.py

from django.db import models
from imagekit.models import ProcessedImageField
from imagekit.processors import ResizeToFill

# Create your models here.

class User(models.Model):
    name = models.CharField(max_length=128, unique=True)
    password = models.CharField(max_length=256)
    email = models.EmailField(unique=True)
    avatar = ProcessedImageField(upload_to='login/avatar', default="login/avatar/default_man.png", processors=[ResizeToFill(100,100)])
    c_time = models.DateTimeField(auto_now_add=True)
    has_confirmed = models.BooleanField(default=False)
    no_comment = models.BooleanField(default=False)
    loved_blog = models.TextField(null=True, blank=True)
    small_description = models.CharField(max_length=256, default="这个人很懒,什么都没有写~")
    big_detail = models.TextField(default="<p>这个人很懒,什么都没有写~</p>")

    def __str__(self):
        return self.name
    
    class Meta:
        ordering = ['-c_time']
        verbose_name = "用户"
        verbose_name_plural = "用户"

 注意:这里面有一个新模块 django-imagekit,需要先使用 pip 安装一下

在 cmd 中输入如下内容安装此模块即可

pip install django-imagekit

 代码注释:

用户本身的信息

1. name:用户名,unique=True 表示不允许出现重复用户名

2. password:用户密码,注意 max_length 要开大一些,因为储存的是加密的密码,长度较大

3. email:用户邮箱,unique=True 表示不允许出现重复邮箱

4. avatar:用户头像,用到了刚安装的 imagekit,这里需要在 settings.py 配置 media,稍后处理

  • upload_to 表示头像图片上传到哪里
  • default 表示默认的头像图片,稍后处理
  • ResizeToFill 表示将图片压缩到 100*100 的尺寸

5. c_time:用户创建时间,auto_now_add=True 表示自动在模型创建时添加时间

6. small_description:用户的签名

7. big_detail:用户的个人介绍,用 TextField 而不是 CharField 是因为可能会出现 html 内容

后面要做的环节带来的信息

8. has_confirmed:用户是否经过邮箱认证,在后面的邮箱认证环节会用到

9. no_comment:用户是否被禁言,在后面的用户评论环节会用到

10. loved_blog:用户点赞了哪些博客,在后面的博客环节会用到

其他:

def __str__(self):Python 内置的魔法方法,用于在 admin 后台中显示看着方便

class Meta:定义模型的元数据

  • ordering=['-c_time'] 表示按照用户创建时间逆序排序
  • verbose_name 为模型定义了一个人类可理解的名称,在后台中显示看着方便
  • verbose_name_plural 和 verbose_name 本质一样,是名称的复数形式

用户模型写好了,因为后面有邮箱验证及重置密码时验证的环节,需要验证码模型

同样还是在 models.py,写入如下代码:

  • ConfirmString 表示邮箱验证时的验证码模型
  • ResetString 表示修改密码时的验证码模型
class ConfirmString(models.Model):
    code = models.CharField(max_length=256)
    tag = models.CharField(max_length=256, default="")
    user = models.OneToOneField('User', on_delete=models.CASCADE)
    c_time = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.user.name + ": " + self.code
    
    class Meta:
        ordering = ["-c_time"]
        verbose_name = "确认码"
        verbose_name_plural = "确认码"

class ResetString(models.Model):
    code = models.CharField(max_length=256)
    user = models.OneToOneField('User', on_delete=models.CASCADE)
    c_time = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.user.name + ":" + self.code

    class Meta:
        ordering = ["-c_time"]
        verbose_name = "密码重置码"
        verbose_name_plural = "密码重置码"

 代码注释(由于两个模型大同小异,且与前面的模型有相似之处,只做部分解释):

1. code:验证码的内容

2. tag:相当于一个获取验证码的标签

3. user:外键,表示验证码的所有者(用户)

  • on_delete=models.CASCADE 表示在关联的用户被删除以后,关联的验证码也跟着删除

注意:这里的验证码内容都是需要加密的,因此 max_length 要开的较大

4. 保存模型至数据库

将所有的模型代码写完后,保存文件

首先,进入 LZLBlog/LZLBlog/settings.py,找到 INSTALLED_APPS 列表,将 'login' 添加进去

 然后打开 cmd,在与 manage.py 同目录下执行

python manage.py makemigrations

 执行后会弹出提示如下 ——

 在 cmd 中,继续执行

python manage.py migrate

执行后弹出提示如下,模型保存至数据库即完成

最后,可以在 LZLBlog/login/admin.py 中输入如下内容,注册模型至 Django 自带的后台

# from django.contrib import admin
from . import models

admin.site.register(models.User)
admin.site.register(models.ConfirmString)
admin.site.register(models.ResetString)

 在 cmd 中输入指令,跟随提示,创建后台的超级管理员

python manage.py createsuperuser

最后运行指令,打开 Django 提供的开发服务器

python manage.py runserver

在浏览器中查看 http://127.0.0.1:8000/admin/ ,使用刚刚注册的超级管理员的用户名与密码登录,即可看到已创建的模型~

 

至此,今天的内容就完结啦~

下篇做登录视图与 URL~