目录
django模式配置也是mvt模式和mvc一样把改成了t
这里用django==2.2版本的
在cmd 中下载 pip install django==2.2.11
创建项目
用pycharm下创建django项目
比如创建路径写在d盘下的blogs中在blogs下有同名的文件夹就是总配置有以下.py的文件
这里拿blogs 举例
创建app应用
在 pycharm 下的终端下输入
python manage.py startapp 应用名
app应用的注册
在settings下INSTALLED_APPS注册
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'user.apps.UserConfig',
'bolgshome',#填写创建的app名字 注册
'artictes',
'comment',
]
连接mysql
连接 mysql数据库 ,在blogs下settings下DATABASES连接默认是sqlite3把他改为以下就是连接到mysql数据库了
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '', #你的数据库名称
'USER': 'root', #你的数据库用户名
'PASSWORD': '', #你的数据库密码
'HOST': '127.0.0.1', #你的数据库主机,留空默认为localhost
'PORT': 3306, #你的数据库端口
}
}
models 写数据库
在到创建app下的models写表用面向对象的方法写
列如:创建一个用户表
from django.db import models
# Create your models here.
from django.contrib.auth.models import AbstractUser
from django.db.models import QuerySet
class MySoftDeletableQuerySet(QuerySet):
"""
当使用filter与all时所执行的操作类
"""
def delete(self):
# 重写删除方法
self.update(is_delete=True)
class BaseManager(models.Manager):
_queryset_class = MySoftDeletableQuerySet
def get_queryset(self):
return super().get_queryset().filter(is_delete=False).order_by('-create_time')
class BaseModel(models.Model):
# auto_now_add 每次新增数据的时候 自动加入时间
create_time = models.DateTimeField(auto_now_add=True,verbose_name='创建时间')
# auto_now 每次修改数据的时候 自动加入时间
update_time = models.DateTimeField(auto_now=True,verbose_name='修改时间')
# 增加字段 用来实现软删除的 默认是False 如果要删除数据,就将这个字段的值改成True
is_delete = models.BooleanField(default=False, verbose_name='是否删除')
# # 肯定父类中有这个方法
def delete(self, using=None, keep_parents=False):
self.is_delete = True # 将这个字段的值改成True
self.save() # 保存
objects = BaseManager()
# 一旦执行迁移 user_basemodel 继承
class Meta:
abstract = True # 最新 发表
# 这是一个抽象的基类 不会为这个类创建数据表 只是作为父类给别人继承而已
ordering = ('-create_time') # 根据创建时间进行排序
class User(AbstractUser,BaseModel):
phone = models.CharField(max_length=11,unique=True,verbose_name="手机号",null=True)
class Meta:
db_table = "tb_user"
verbose_name = "用户"
verbose_name_plural = verbose_name
def __str__(self):
return self.username
在 pycharm终端下执行数据迁移
执行这俩个命令
python manage.py makemigrations
python manage.py migrate
提示:在models下修改都要执行数据迁移
创建超级用户
在 pycharm 终端下 执行以下命令
python manage.py startsuperuser
配置静态文件
在blogs下的settings下写入
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
url路由分发
首先在创建的应用的文件夹下创建urls.py文件,比如创建的是user这个应用在他下面创建urls.py文件
在总路由下写入,就是blogs文件下的urls写入
from django.contrib import admin
from django.urls import path,include,# 导入include这个方法
from user import urls as user_urls #导入user应用下的urls取别名
urlpatterns = [
path('admin/', admin.site.urls),
path('',include(user_urls,namespace="user")),#namespace 命名空间
再到刚刚user应用下的urls.py文件下写入
from django.urls import path
from user import views #导入user下 的 views
app_name="user" #命名空间
urlpatterns = [
path('register/',views.User.as_view())#写路由路径
]
再到 templates下创建user文件在创建注册页面的.html文件, 写的比较丑, 这里用了继承语法
{% extends "home.html" %}
{% block data %}
<style>
span {
font-size: 30px;
}
</style>
<form action="" method="post">
{% csrf_token %}
<div class="row">
<h1 class="text-center">注册</h1>
<div class="col-md-12">
<div>
<label for="">用户名:</label>
<input type="text" id="username" name="username" class="form-control">
</div>
<div>
<label for="">密码:</label>
<input type="password" id="password" name="password" class="form-control">
</div>
<div>
<label for="">确认密码:</label>
<input type="password" id="qr_password" name="qr_password" class="form-control">
</div>
<div>
<label for="">邮箱:</label>
<input type="email" id="email" name="email" class="form-control">
</div>
<div>
<label for="">手机号:</label>
<input type="text" id="phone" name="phone" class="form-control">
</div>
<div>
<span style="color: red">{{ register_errmsg }}</span>
</div>
<div>
<input type="submit" class="btn btn-primary form-control" value="注册">
</div>
</div>
</div>
</form>
{% endblock %}
再到 user下的 views下处理逻辑
from django.shortcuts import render,redirect,reverse,get_object_or_404
# Create your views here.
import re
from django.views import View
from user.models import *
from django.contrib.auth.decorators import login_required
class Register(View):
def get(self, request):#get是要数据
return render(request, 'user/register.html')#返回 注册页面
def post(self, request):#post是提交数据
username = request.POST.get('username') #通过post.get拿到数据
password = request.POST.get('password')
qr_password = request.POST.get('qr_password')
phone = request.POST.get('phone')
email = request.POST.get('email')
if not all([username,password,qr_password,phone,email]):#反向判断是否有参数
return render(request, 'user/register.html',{"register_errmsg":"输入不全,请重新输入"})#register_errmsg 渲染错误信息 可以用ajax 和 form组件来进行渲染
if not re.match(r'^[a-zA-Z0-9_-]{5,20}$', username):
return render(request, 'user/register.html', {'register_errmsg': '请输入5-20个字符的用户名'})
if not re.match(r'^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.(com|cn|net)', email):
return render(request, 'user/register.html', {'register_errmsg': '邮箱格式不正确'})
if not re.match(r'^1[3456789]\d{9}$', phone):
return render(request, 'user/register.html', {'register_errmsg': '手机号不正确'})
if not re.match(r'^[0-9A-Za-z]{6,20}$', password):
return render(request, 'user/register.html', {'register_errmsg': '请输入6-20个字符的密码'})
# 判断两次密码是否一致
if password != qr_password:
return render(request, 'user/register.html', {'register_errmsg': '两次输入的密码不一致'})
try:#异常捕获
User.objects.create_user(username=username,password=password,email=email,phone=phone)#创建数据信息
except Exception as err:
return render(request, 'user/register.html',{'register_errmsg':'用户名重复'})#错误返回注册页面
return redirect(reverse("user:login")) 用reverse解析,正确返回登陆页面
实现跳转
测试完成
功能实现
全部源码在git 托管里
地址:blogs: 胡桃的博客