django 最简单的 项目开发与配置 快速 复习

目录

创建项目

这里拿blogs 举例

创建app应用

app应用的注册

连接mysql

models 写数据库

配置静态文件

url路由分发


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: 胡桃的博客

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值