django

Posted huangxuanya

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django相关的知识,希望对你有一定的参考价值。

昨日内容回顾

纯手撸简易版的web框架

HTTP协议:
规定了客户端与服务端消息传输的格式

四大特性:
1.基于tcp/ip协议,作用于应用层的协议
2.基于请求响应
3.无状态
4.无连接

请求消息格式
请求手首行
请求头(一大堆kv键值对)

请求体(post请求携带的数据)

响应消息格式
响应手首行
响应头(一大堆kv键值对)

响应体(post请求携带的数据)

响应状态码
1xx:服务端已接收到你的数据了,正在处理,你可以继续提交
2xx:请求成功,返回相应资源
3xx:重定向
4xx:请求资源不存在
5xx:服务器内部错误

想根据用户访问的不同路径返回不同的页面
手动对http请求格式的数据进行切分等一系列处理获取到用户访问的路径
后端逻辑判断
借助于wsgiref帮助我们处理socket以及http数据

动态展示当前时间
后端利用字符串的替换html中特殊符号的部分

基于jinja2完成模板渲染
后端:user_dic=‘name’:'jason',"password":'123'
前端:
user_dic
user_dic.name
user_dic['name']
user_dic.get('name')
ps:jinja2提供了和python后端几乎一样的操作数据的方式 (django有些不支持)

后端:user_list=[,,]
前端:
% for user_dict in user_list %
    user_dic
% endfor %

:跟变量相关
%%:跟逻辑相关


动静态网页
静态网页:数据是写死的,万年不变
动态网页:数据是动态获取的,可以是当前的时间,也可以是数据库数据

python三大主流web框架:
django:
flask:
tornado:

a:socket
b:路由与视图函数对应关系
c:模板渲染

django:a别人的b,c自己写的
flask: b是自己的,a,c都是别人的
tornado:都是自己写的

django
版本问题:推荐使用1.11
确保django能够正常启动需要注意
1.计算机的名称不要有中文
2.项目名不要起中文
3.一个pycharm窗口就只放在一个工程(项目)

安装
命令行
    pip3 install django==1.11.11
测试是否安装成功
    django-admin
创建django项目
    django-admin startproject 项目名称(不要用中文)
    项目名文件夹(注意是项目,不是应用)
        __init__.py
        settings.py 配置文件(这是暴露的配置文件(你可以配置),说明django内部有自己大的文件配置)
        urls.py  路由与视图函数对应关系
        wsgi.py
    manage.py
    创建app
        python3 manage.py startapp 应用名
        应用名文件夹
            __init__.py
            admin.py (django后台管理所有的模型表都注册的话,可以对其增删改查(就不用到数据库修改),例如博客园的随笔管理)
            models.py  (所有的class都放在里面)
            views.py (所有的视图函数)(视图函数并不只是函数,有可能是类,只要是处理后端逻辑的)
    启动django
        python3 manage.py runserver
    停止django项目
        ctrl+c
     命令行创建不会自动创建templates文件夹
     TEMPLATES = [
    
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]  #配置路径
        ,
        'APP_DIRS': True,
        'OPTIONS': 
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        ,
    ,
]


pycharm
    new project 选django 选本机解释器 勾选admin后台管理
    两种创建app的方式
        完整的命令
        manage task 简便命令
     小绿色往右点击自动启动

     edit conf.....可以修改端口号

app的概念
一所大学里面有很多学院,每一个学院都有自己独特的功能

注意新创建的app需要在配置文件中注册才能生效(*******************)
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
   'app01.apps.App01Config'  # 可以用全称
   'app01'              # 也可以简写
]
ps:pycharm能自动帮你创建一个app并自动注册到配置文件中

django小白必会三板斧
HTTPResponse:返回字符串
render:返回html并且支持模板渲染
redirect:重定向
即可以重定向到别人的网址也可以定向到自己的


今日内容:
手把手带你写登录功能
pycharm 连接数据库
orm简单操作
图书馆里系统表分析


登录功能
1.路由访问如果不加斜杠 会内部自动重定向加斜杠的路由

所有的html文件默认都写在templates文件夹下
所有的静态文件(css,js,前端第三方类库默认都放在static文件夹)

# html页面引入外部资源的方式
cdn
本地 (在服务端)
bootstrap在服务端本地,但是发给html页面给浏览器就访问不到你服务端本地的了,除非你给我路径去查找,
不然你写的文件夹路径,只能服务端你自己可以访问

静文件配置
STATIC_URL = '/static/'
静态文件配置
STATICFILES_DIRS=[
    os.path.join(BASE_DIR,'static')
]
暴露给外界能够访问服务器静态文件夹下面所有的资源


STATC_URL='/xxx/' #跟你的静态文件夹的名字一点关系都没有
#静态文件配置
STATIC_URL = '/static/'
STATICFILES_DIRS=[
    os.path.join(BASE_DIR,'static'), #就是你的静态文件夹静态路径
    os.path.join(BASE_DIR, 'static1'),
    os.path.join(BASE_DIR, 'static2')
]
# # ps:会依次查找列表中所有的静态文件路径 找到的话立刻停止,都没有找到返回404
每一个app都有自己的tmaplate css等


form表单触发数据的动作两种方式
<input type='submit'>
<button><button>

form 提交数据的地址如何指定及方式
action:属性控制提交的地址
1.全路径
<form action="http://127.0.0.1:8000/logins/">
2.只写路径后缀
<form action="/login/">
3.不写,默认当前页面的路径
form 表单默认就是get请求

根据客户端请求方式的不同执行不同的逻辑代码
def logins(request):
    # return HttpResponse('login')

    #获取用户端提交的请求方式
    print(request.method)    #post 请求会报错,就要到settings中将某个东西注掉   拿到请求方式是全大写的
    if request.method == 'GET':
        return render(request,'logins.html')
    elif request.method == 'POST':
        return HttpResponse('来了,laodi')

个人建议按照下面这种方式书写 减少代码冗余及结构混乱的问题
def login(request):
   if request.method == 'POST':
      return HttpResponse('OK')
    return render(request,'login.html')
#要想一次性获取value列表里面的所有数据要用getlist  应用场景:用户多选择

def login(request):
#     # 获取用户端提交的请求方式
#     print(request.method)  # 拿到的请求方式是全大写的字符串
#     # if request.method == 'GET':
#     #     return render(request,'login.html')
#     # elif request.method == 'POST':
#     #     return HttpResponse("收到了 老弟")
#     if request.method == 'POST':
#         print(request.POST)  # 你就把它当成一个大字典里面存放了客户端post提交的所有的数据
#         # request.POST:< QueryDict: 'username': ['jason'], 'password': ['123'] >
#         print(request.POST.get('username'))  # value虽然是个列表但是获取value的时候拿到却是单个元素
#         # 默认只会取value列表里面的最后一个元素
#     # request.POST:<QueryDict: 'username': ['jason', 'egon'], 'password': ['123']>
#         print(request.POST.getlist('username'))  # 要想一次性获取value列表里面所有的数据需要用getlist()
#         # ['jason', 'egon']
#     print(request.POST['password'])  # 不推荐使用该方法获取数据
#         return HttpResponse('OK')
#     return render(request,'login.html')
#
#  获取value列表里面所有的元素需要使用getlist  应用场景:用户的爱好 多选框
#  get只会获取到value列表的最后一个元素


print(request.GET)  # <QueryDict: 'username': ['jason'], 'password': ['123']>
    request.GET.get('user')
   # <QueryDict: 'username': ['jason','egon'], 'password': ['123']>
   request.GET.getlist('username')

#默认自带的小型的sqlite数据库可以用来本机测试
DATABASES = 
    'default': 
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    

djangp连数据库
需要修改文件
   django连接数据库
   1.需要修改配置文件
      DATABASES = 
         'default': 
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'day54',
            'HOST':'127.0.0.1',
            'PORT':3306,
            'USER':'root',
            'PASSWORD':'123'
         
      
      ps:键必须都是大写

   2.告诉django用pymysql替换它默认mysqldb模块连接数据库
      方式1:在你的项目文件夹下面的__init__.py
      方式2:也可以在你的应用文件夹下面的__init__.py

      # 固定写法
      import pymysql
      pymysql.install_as_MySQLdb()  # 告诉django用pymysql代替mysqldb连接数据库



什么是ORM?
对象关系映射
类》》表
对象》》表记录
对象的属性》》一条记录某一个字段对应的值
django的orm不能够自动帮你创建库,但是可以帮你创建表
提示:一个django项目就使用一个库,不要多个django项目使用一个库

提示:数据库同步迁移命令
python3 manage.py makemigrations 将你的数据库变动记录到一个小本本上(只是记录,不会创建表)
E:\django\login>python3 manage.py makemigrations
Migrations for 'app01':
  app01\migrations\0001_initial.py
    - Create model User
python3 manage.py migrate将你的数据库变动正在同步到数据库中


新增数据
# 操作数据库user表插入数据
# 方式1:
user_obj = models.User.objects.create(name=username,password=password)
# 方式2:
user_obj = models.User(name=username,password=password)
user_obj.save()  # 对象调用save方法保存到数据库

查询数据
user_list = models.User.objects.all()  # 获取user表所有的数据
# 只要是QuerySet就可以点query查看获取到当前QuerySet对象的内部sql语句
print(user_list.query)


利用a标签href属性,可以指定页面跳转的路劲,href可以写全路径,但是推荐写后缀即可
<a href="/reg/" class="btn btn-success">添加数据</a>
# 注意 路径的书写一定要加斜杠


重定向  可以写别人的网址也可以是自己的路径
return redirect('/userlist')
return redirect('/userlist/')



queryset对象支持索引取值 但是不推荐你使用  推荐使用自带的.first()帮你获取第一条数据


删除
models.User.objects.filter(id=1).delete()  # 会将queryset所有的数据对象全部删除




查询数据需要注意的是你获取到的到底是一个queryset还是一个数据对象
user_query = models.User.objects.filter(id=edit_id).first()  # 如果你是要获取数据对象first千万别忘了
# filter当条件不存在的情况下会返回一个空的queryset对象
<QuerySet []> <class 'django.db.models.query.QuerySet'>

user_obj = models.User.objects.get(id=edit_id)  # 用get可以直接获取到数据对象本身但是查询条件不存在的情况下直接报错




编辑
编辑对象的id的获取方式
方式1:利用input隐藏一个标签
<input type="hidden" name="edit_id" value=" user_obj.pk ">
方式2:
<form action="/edit/?edit_id= user_obj.pk " method="post">

注意:queryset对象点修改 删除 会作用于对象内部所有的数据对象  类似于批量操作
方式1:
models.User.objects.filter(id=edit_id).update(name=username,password=password)
方式2:获取到当前数据对象
user_obj = models.User.objects.filter(id=edit_id).first()
user_obj.name = username
user_obj.save()

ps:视图函数必须返回视图函数

修改模型层里面的跟表相关的所有的数据,只要你修改了就必须重新执行数据库迁移命令
python manage.py makemigrations     记录到小本本上
python manage.py migrate         真正操作数据库






django请求生命周期



图书管理系统表设计
书籍表


作者


出版社

外键字段名 orm会自动在字段名后面加_id.无论你的字段名有没有_id

models

from django.db import models


# Create your models here.

class User(models.Model):
    # user表的主键字段名就是id
    id = models.AutoField(primary_key=True)
    # varchar (32) name 字段是varchar(32) CharField在定义的时候必须是加max_length参数
    name = models.CharField(max_length=32)

    password = models.CharField(max_length=16)
    addr = models.CharField(max_length=32, default='China')

    def __str__(self):
        return self.name


class Book(models.Model):
    # id可以不写,会自动创建
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8, decimal_places=2)
    # 一对多外键字段建立
    publish = models.ForeignKey(to="Publish",on_delete=models.CASCADE) #默认是与publish表的id字段建立关联
    # 默认是与publish表的id字段建立关联   外键字段名,orm会在自动在字段名后面加_id(查看数据库)(所以不要写publish_id)
    # 多对多外键字段建在关联的两张表的任何一张表里面都可以,建议你建在查询频率比较高的那张表里
    author = models.ManyToManyField(to='Author')  # django 会自动帮你创建book与author表的第三张表
    # 多对多字段不会显示在表的字段中


class Publish(models.Model):
    name = models.CharField(max_length=32)
    email = models.CharField(max_length=32)


class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.ImageField()

views

from django.shortcuts import render,HttpResponse,redirect
from app01 import models
# Create your views here.
import pymysql

def logins(request):
    # return HttpResponse('login')

    #获取用户端提交的请求方式
    print(request.method)    #post 请求会报错,就要到settings中将某个东西注掉   拿到请求方式是全大写的
    # if request.method == 'GET':
    #     return render(request,'logins.html')
    # elif request.method == 'POST':
    #     return HttpResponse('来了,laodi')

    # < QueryDict: 'username': ['jason'], 'password': ['123'] >
    # < QueryDict: 'username': ['yaya', 'yaya'], 'password': ['123'] >
    if request.method == 'POST':
        # 获取用户输入的用户名和密码
        username=request.POST.get('username')
        password=request.POST.get('password')
        conn = pymysql.connect(
            host='127.0.0.1',
            port=3306,
            user='root',
            password='123',
            database='day55',
            charset='utf8',
            autocommit=True
        )
        cursor = conn.cursor(pymysql.cursors.DictCursor)
        cursor.execute("select * from app01_user where name=%s and password=%s",(username,password))
        user_info=cursor.fetchall()
        print(user_info)
        if user_info:
            return HttpResponse('登录成功')
        print(request.POST)  #你就把它当成一个大字典里面存放了客户端post提交的所有提交数据
        # request.POST:< QueryDict: 'username': ['jason'], 'password': ['123'] >
        print(request.POST.get('username'))  # value 虽然是个列表但是获取的value 的时候拿到的是单个元素
        # # 默认只会取value列表里面的最后一个元素
        # print(request.POST.getlist('username'))  # 要想一次性获取value列表里面所有的数据需要用getlist()
        #要想一次性获取value列表里面的所有数据要用getlist()
        print(request.POST.getlist('name'))#不推荐使用该
        print(request.POST['password'])
        print(request.GET) #get请求数据的方式跟post请求完全一样  <QueryDict: 'username': ['jason'], 'password': ['123']>
        # 获取get请求数据的方式跟post请求完全一样!!!
        return HttpResponse('ok')
    return render(request,'logins.html')


def reg(request):
    if request.method == 'POST':
        #获取用户输入的用户名和密码
        username=request.POST.get('username')
        password=request.POST.get('password')
        #操作数据库user表
        #方式1
        user_obj = models.User.objects.create(name=username,password=password)
        #方式2:
        user_obj = models.User(name=username,password=password)
        user_obj.save()#对象用save方法保存到数据库

        print(user_obj.pk) #获取主键值,无论你的主键字段叫什么名字
        print(user_obj.password) # 获取用户数据的password值
        print(user_obj.name)  #获取用户数据的name值
        #内部重定向,可以写别人的网址,也可以自己的网址
        return redirect('/user')
    return render(request,'reg.html')

def user(request):
    #获取数据库数据
    user_list = models.User.objects.all()  #select id,name,password from User
    print(user_list.query) #只要是QuerySet就可以点query查看获取到当前query对象的内部sql语句
    for user_obj in user_list:
        print(user_obj.pk,user_obj.name)
    # return HttpResponse('ok')
    return render(request,'user.html',locals())


def delete_user(request):
    #从get请求携带的参数中获取用户想要删除的信息id
    delete_id = request.GET.get('delete_id')
    # res=models.User.objects.filter(id=delete_id).first()
    models.User.objects.filter(id=delete_id).delete() #会将queryset所有对象全部删除
    # res=models.User.objects.filter(id=delete_id)[0]
    # print(res)  #相当于<QuerySet [<User: jason>]>
    # print(res.query)
    # print(type(res))
    return redirect('/user')


def edit(request):
    if request.method == 'POST':
        print(request.GET)
        print(request.POST)
        username= request.POST.get('username')
        password = request.POST.get('password')
    #获取用户想要修改用户的的数据id
        edit_id = request.POST.get('edit_id')
        edit_id= request.GET.get('edit_id')
    #将该数据查询出来渲染到一个编辑页面
    #查询数据方式一
    # user_query = models.User.objects.filter(id=edit_id).first()
    #查询数据方式2
    # user_obj  = models.User.objects.get(id=edit_id)  #用get可以直接获取到数据对象本身
    # print(user_query.type(user_query))
    # return HttpResponse('edit')
        # 更新数据库
        models.User.objects.filter(id=edit_id).update(name=username,password=password)
        return redirect('/user')
    #获取用户想要修改的数据的id
    edit_id = request.GET.get('edit_id')
    #将该数据查询出来渲染到一个渲染页面
    user_obj = models.User.objects.filter(id=edit_id).first()
    #将当前数据渲染到一个编辑页面上
    return render(request,'edit.html',locals())

settings

from django.shortcuts import render,HttpResponse,redirect
from app01 import models
# Create your views here.
import pymysql

def logins(request):
    # return HttpResponse('login')

    #获取用户端提交的请求方式
    print(request.method)    #post 请求会报错,就要到settings中将某个东西注掉   拿到请求方式是全大写的
    # if request.method == 'GET':
    #     return render(request,'logins.html')
    # elif request.method == 'POST':
    #     return HttpResponse('来了,laodi')

    # < QueryDict: 'username': ['jason'], 'password': ['123'] >
    # < QueryDict: 'username': ['yaya', 'yaya'], 'password': ['123'] >
    if request.method == 'POST':
        # 获取用户输入的用户名和密码
        username=request.POST.get('username')
        password=request.POST.get('password')
        conn = pymysql.connect(
            host='127.0.0.1',
            port=3306,
            user='root',
            password='123',
            database='day55',
            charset='utf8',
            autocommit=True
        )
        cursor = conn.cursor(pymysql.cursors.DictCursor)
        cursor.execute("select * from app01_user where name=%s and password=%s",(username,password))
        user_info=cursor.fetchall()
        print(user_info)
        if user_info:
            return HttpResponse('登录成功')
        print(request.POST)  #你就把它当成一个大字典里面存放了客户端post提交的所有提交数据
        # request.POST:< QueryDict: 'username': ['jason'], 'password': ['123'] >
        print(request.POST.get('username'))  # value 虽然是个列表但是获取的value 的时候拿到的是单个元素
        # # 默认只会取value列表里面的最后一个元素
        # print(request.POST.getlist('username'))  # 要想一次性获取value列表里面所有的数据需要用getlist()
        #要想一次性获取value列表里面的所有数据要用getlist()
        print(request.POST.getlist('name'))#不推荐使用该
        print(request.POST['password'])
        print(request.GET) #get请求数据的方式跟post请求完全一样  <QueryDict: 'username': ['jason'], 'password': ['123']>
        # 获取get请求数据的方式跟post请求完全一样!!!
        return HttpResponse('ok')
    return render(request,'logins.html')


def reg(request):
    if request.method == 'POST':
        #获取用户输入的用户名和密码
        username=request.POST.get('username')
        password=request.POST.get('password')
        #操作数据库user表
        #方式1
        user_obj = models.User.objects.create(name=username,password=password)
        #方式2:
        user_obj = models.User(name=username,password=password)
        user_obj.save()#对象用save方法保存到数据库

        print(user_obj.pk) #获取主键值,无论你的主键字段叫什么名字
        print(user_obj.password) # 获取用户数据的password值
        print(user_obj.name)  #获取用户数据的name值
        #内部重定向,可以写别人的网址,也可以自己的网址
        return redirect('/user')
    return render(request,'reg.html')

def user(request):
    #获取数据库数据
    user_list = models.User.objects.all()  #select id,name,password from User
    print(user_list.query) #只要是QuerySet就可以点query查看获取到当前query对象的内部sql语句
    for user_obj in user_list:
        print(user_obj.pk,user_obj.name)
    # return HttpResponse('ok')
    return render(request,'user.html',locals())


def delete_user(request):
    #从get请求携带的参数中获取用户想要删除的信息id
    delete_id = request.GET.get('delete_id')
    # res=models.User.objects.filter(id=delete_id).first()
    models.User.objects.filter(id=delete_id).delete() #会将queryset所有对象全部删除
    # res=models.User.objects.filter(id=delete_id)[0]
    # print(res)  #相当于<QuerySet [<User: jason>]>
    # print(res.query)
    # print(type(res))
    return redirect('/user')


def edit(request):
    if request.method == 'POST':
        print(request.GET)
        print(request.POST)
        username= request.POST.get('username')
        password = request.POST.get('password')
    #获取用户想要修改用户的的数据id
        edit_id = request.POST.get('edit_id')
        edit_id= request.GET.get('edit_id')
    #将该数据查询出来渲染到一个编辑页面
    #查询数据方式一
    # user_query = models.User.objects.filter(id=edit_id).first()
    #查询数据方式2
    # user_obj  = models.User.objects.get(id=edit_id)  #用get可以直接获取到数据对象本身
    # print(user_query.type(user_query))
    # return HttpResponse('edit')
        # 更新数据库
        models.User.objects.filter(id=edit_id).update(name=username,password=password)
        return redirect('/user')
    #获取用户想要修改的数据的id
    edit_id = request.GET.get('edit_id')
    #将该数据查询出来渲染到一个渲染页面
    user_obj = models.User.objects.filter(id=edit_id).first()
    #将当前数据渲染到一个编辑页面上
    return render(request,'edit.html',locals())

urls

"""login URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('logins/', views.logins),
    path('reg/', views.reg),
    path('user/',views.user),
    path('delete_user/',views.delete_user),
    path('edit/',views.edit)
]

wsgi

"""
WSGI config for login project.

It exposes the WSGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/
"""

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'login.settings')

application = get_wsgi_application()

edit

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>

    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>

    <link href="https://cdn.bootcss.com/font-awesome/5.8.2/css/fontawesome.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/font-awesome/5.8.2/js/fontawesome.min.js"></script>

    <link href="https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/sweetalert/2.1.2/sweetalert.min.js"></script>
</head>
<body>
<div class="container">
    <dic class="row">
        <h1>编辑数据</h1>
        <div class="col-md-8 clo-md-offset-2">
            <form action="/edit/?edit_id=user_obj.pk" method="post">
                <input type="hidden" name="edit_id" value="user_obj.pk">
                <p>username:<input type="text" name="username" value="user_obj.name"></p>
                <p>password:<input type="password" name="password" value="user_obj.password"></p>
                <input type="submit" class="btn btn-warning">
            </form>
        </div>
    </dic>
</div>
</body>
</html>

logins

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>

    <link rel="stylesheet" href="/xxx/static/bootstrap/css/bootstrap.min.css">
    <script src="/xxx/static/bootstrap/js/bootstrap.min.js"></script>

    <link href="https://cdn.bootcss.com/font-awesome/5.8.2/css/fontawesome.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/font-awesome/5.8.2/js/fontawesome.min.js"></script>

    <link href="https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/sweetalert/2.1.2/sweetalert.min.js"></script>
</head>
<body>
<h1>login</h1>
<div class="container">
    <div class="row">
        <h1>登录页面</h1>
        <div class="col-md-6 col-md-offset-3">
            <form action="http://127.0.0.1:8000/logins/" method="post">
                <h1>登录页面</h1>
                <p>username:<input type="text" class="form-control" name="username"></p>
#                <p>username:<input type="text" class="form-control" name="username"></p>#
                <p>password:<input type="text" class="form-control" name="password"></p>
                <input type="submit" class="btn btn-success">
            </form>
        </div>
    </div>
</div>
</body>
</html>

reg

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>

    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>

    <link href="https://cdn.bootcss.com/font-awesome/5.8.2/css/fontawesome.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/font-awesome/5.8.2/js/fontawesome.min.js"></script>

    <link href="https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/sweetalert/2.1.2/sweetalert.min.js"></script>
</head>
<body>
<div class="container">
    <div class="row">
        <h1>注册页面</h1>
        <div class="col-md-8 col-ms-offset-2">
            <form action="" method="post">
                <p>username:<input type="text" name="username"></p>
                <p>password:<input type="password" name="password"></p>
                <input type="submit" class="btn btn-primary">
            </form>
        </div>
    </div>
</div>

</body>
</html>

user

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>

    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>

    <link href="https://cdn.bootcss.com/font-awesome/5.8.2/css/fontawesome.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/font-awesome/5.8.2/js/fontawesome.min.js"></script>

    <link href="https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/sweetalert/2.1.2/sweetalert.min.js"></script>
</head>
<body>
<div class="container">
    <div class="row">
        <h1>展示数据</h1>
        <div class="col-md-8 col-ms-offset-2">
            <table class="table table-bordered table-striped table-hover">
                <thead>
                <tr>
                    <th>id</th>
                    <th>name</th>
                    <th>password</th>
                </tr>
                </thead>
                <tbody>
                    % for user_obj in user_list %
                <tr>
                    <td> user_obj.pk </td>
                    <td> user_obj.name </td>
                    <td> user_obj.password </td>
                    <td>
                        <a href="/edit/?edit_id=user_obj.pk " class="btn btn-primary ">编辑</a>
                        <a href="/delete_user/?delete_id= user_obj.pk" class="btn btn-danger "></a>删除</td>

                </tr>

                    % endfor %

                </tbody>
            </table>
        </div>
    </div>
</div>
</body>
</html>

以上是关于django的主要内容,如果未能解决你的问题,请参考以下文章

django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段

Django REST框架--认证和权限

如何在 Django 中显式重置模板片段缓存?

使用 Django 模板作为片段

python 通过django片段很多很多

JavaScript 片段在 Django 模板中不起作用