我8月份的时候接触Django几天,一个月后再打开未完工项目发现又是一头雾水,文档确实很详细,但是对于我来说,一大片的文字很是头疼,于是记录一下我自己的学习过程。如有错误,敬请指出。
开始
环境
Python 3.7.2
Django 2.2.5
从看到后台管理界面开始
使用pycharm的专业版很快能够新建一个初始化的项目。
然后点击绿色三角形,just运行。
打开 http://127.0.0.1:8000/,你会看到一个欢迎界面:
当我们想看到后台管理系统,试图访问http://127.0.0.1:8000/admin 却显示错误的时候,其实是我们还没有默认的用户表,也没有管理员的账号密码信息
python manage.py migrate # 初始化默认表信息
python manage.py createsuperuser # 创建后台管理员账号我们再访问http://127.0.0.1:8000/admin 可以看到正常的后台管理页面了!输入账号密码,就可以看到一个“简陋”的后台,一个简单的后台是不是如此简单!是不是很兴奋。
使用simpleui开源项目一键美化界面
只需两步:
- 设置文件中包括该项目
 setting.py
 INSTALLED_APPS = [
      'simpleui',
      'django.contrib.admin',
      'django.contrib.auth',
      'django.contrib.contenttypes',
      'django.contrib.sessions',
      'django.contrib.messages',
      'django.contrib.staticfiles',
      ...
  ]
  
STATIC_ROOT = os.path.join(BASE_DIR, "static")- pip3安装
pip3 install django-simpleui # 安装命令
python3 manage.py collectstatic #将框架静态文件拷贝项目目录的static目录然后重新编译运行一下,再打开后台看一下。
对了,可以在setting.py里面将语言设置为中文:
LANGUAGE_CODE = "zh-hans"深入
创建一个自己的表
- 在进行这一步之前,我们需要先新建一个模块。
这很容易理解,一个应用/系统按照功能需要划分成一个或多个模块。
我先新建一个usermanager一个模块:
python manage.py startapp usermanager会发现项目中多一个名称为usermanaage文件夹。
我们稍后再去具体介绍这个项目结构。
- 我们还需要在setting.py文件中将该模块包括进来
INSTALLED_APPS = [
    'simpleui',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
'usermanager.apps.UsermanagerConfig'# 包括进来
]- 定义并创建表
在该文件夹下面有usermanager/models.py文件,这个文件用来定义这个模块所需要的所有表信息(一个或多个)。每个表都是使用一个类来定义的。
from django.db import models
# Create your models here.
class User(models.Model):
    id = models.AutoField(primary_key=True)
    qq = models.IntegerField(verbose_name="QQ号码")
    password = models.CharField(verbose_name="密码", max_length=100)
class UserDomains(models.Model):
    id = models.AutoField(primary_key=True)
    userid = models.ForeignKey(User, on_delete=models.SET_NULL, blank=False, null=True, verbose_name='用户')
    domain = models.CharField(verbose_name="域名", max_length=100)
    remark = models.TextField(verbose_name="备注信息")
上面我简单定义了两个表:user和与user管理的domains表。
在命令台中,执行下面命令
python manage.py makemigrations usermanager # 为你的usermanage项目生成迁移文件(Python代码)
python manage.py sqlmigrate usermanager 0001 # 根据迁移文件生成sql代码
python manage.py migrate # 未整个项目进行是数据库迁移,这一步才是真正修改数据库的执行第一条命令会在模块文件夹下的migration文件夹下生成一个以数字开头的迁移文件:
执行第二条命令会输出相应的sql语句:
hewro@hewrodeMacBook-Pro  ~/PycharmProjects/haandsome_auth  python manage.py sqlmigrate usermanager 0001 # 根据迁移文件生成sql代码
BEGIN;
--
-- Create model User
--
CREATE TABLE "usermanager_user" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "qq" integer NOT NULL, "password" varchar(100) NOT NULL);
--
-- Create model UserDomains
--
CREATE TABLE "usermanager_userdomains" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "domain" varchar(100) NOT NULL, "remark" text NOT NULL, "userid_id" integer NULL REFERENCES "usermanager_user" ("id") DEFERRABLE INITIALLY DEFERRED);
CREATE INDEX "usermanager_userdomains_userid_id_9645d39d" ON "usermanager_userdomains" ("userid_id");
COMMIT;执行第三条命令,是在数据库中建立了相应的表。
表默认是使用sqlite数据库,也就是项目文件夹下的db.sqlite3文件。
pycharm自带了数据库查看工具,可以直接连上。
用户表的名称是模块名_类名。除此之外,一开始项目就初始化了很多表。
在后台管理界面显示该表的管理界面
我们可以在admin.py里面增加一行代码:
from django.contrib import admin
# Register your models here.
from usermanager.models import User, UserDomains
admin.site.register(User)
admin.site.register(UserDomains)这表示,我们在后台管理界面注册了与该表相关的管理界面。(当然默认是很简陋的)
相关常用字段介绍
AutoField # 主键
ForeignKey # 外键
CharField # 字符串
TextField # 文本
IntegerField # 数字
DateTimeField # 日期字段相关属性介绍
verbose_name # 中文名称
unique # 字段值是否唯一
default # 默认值
max_length # 最大长度项目结构
- 第一个框是项目的配置文件夹 - setting.py 整个项目的配置基本都在这里
- urls.py 是项目整个接口定义文件
 
- 第二个框就是模块,每个模块都会有一个文件夹 - migration文件夹:这里面的文件就是models.py 里面的数据库迁移文件,每修改并执行一次makemigrations命令,都会增加一个文件
- admin.py:后台管理界面
- app.py:模块定义文件
- views.py:接口具体实现文件
 
- migration文件夹:这里面的文件就是models.py 里面的数据库迁移文件,每修改并执行一次
写一个简单的json接口
除了后台管理,我们可能还需要定义一些自定义接口,以便外部调用。
这个接口返回数据可能是html代码(视图),也可能是json数据。
实现一个简单接口只需要两步。
- 实现接口实现函数
为了让json返回数据更标准,我一般使用一个工具类来格式化需要返回的数据。
项目目录中新建common目录,新建utils.py:
from django.http import JsonResponse
def json_response(status, msg, data=None):
    if data is None:
        data = []
    resp = dict(
        meta=dict(
            status=status,
            msg=msg,
        ),
        data=data
    )
    print(JsonResponse(resp))
    return JsonResponse(resp)在模块的views.py(usermanager/views.py):
# Create your views here.
from common.utils import json_response
def hello(request):
    return json_response(200,"hello word",[])- 在urls.py中进行接口定义
至于定义接口,我们有两种方式
- 直接在项目的urls.py里面定义
- 在模块下面新建一个urls.py,然后在项目的urls.py里面引入这个文件
我们选择第二种方式。
在usermanager/urls.py 文件中:
from django.urls import path
from . import views
# 定义接口
urlpatterns = [
    path('hello', views.hello),
]在项目配置文件夹下面的haandsome_auth/urls.py:
urlpatterns = [
    path('admin/', admin.site.urls),
    path('user/', include('usermanager.urls')),
]至此一个简单的接口实现成功:http://127.0.0.1:8000/user/hello
操纵数据库
更常见的是在实现接口函数的时候需要调用数据库。Django实现一种非常简单的方式。
比如,接口请求中包含一个域名地址参数,我们调用该接口,判断该域名是否存在数据库中。
接口地址:
http://127.0.0.1:8000/user/is_good?domain=https://www.ihewro.com
具体的函数实现如下:
def is_good(request):
    if request.method == "GET":
        domain = request.GET.get("domain")
        return_dict = {'domain': domain}
        status = 200
        try:
            query = UserDomains.objects.get(domain=domain)
            query_user = User.objects.get(id=query.userid.id)
            user = {
                "qq": query_user.qq,
                "date": query_user.date
            }
            return_dict['user'] = user
        except UserDomains.DoesNotExist:
            status = 404
        return json_response(status, "", return_dict)
操作数据库直接调用类的objects方法。详细文档可以看这里:https://docs.djangoproject.com/zh-hans/2.2/topics/db/queries/
常用方法如下:
# 查询
.get() #返回一条记录queryset
.filter() # 返回符合条件的queryset的列表
## 查询条件的写法就是写在函数参数里,可以接收多个条件,可以多次链式调用
# 修改
## 方法一:(get,filter都适用)
user=User.objects.get(id=1)
user.qq="4444444"
user.save()
## 方法二(只适用filter方法)
users = User.objects.filter(id=1)
users[0].update(qq="44444")
# 删除
## 先查询再删除
queryset.delete()
# 增加
b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')
b.save()
上述代码还涉及到从get请求中获取参数,一看代码便知。同理POST请求的方法也是类似的,将GET换成POST即可。










 
                             
                            
14 条评论
我写python web的我竟然都不知道 django有美化
太高深,看不懂,哇哈哈
py创建web时会自动有个鉴权,后台等 感觉这对初学者很友好。之前写零基础学node时,理解这些具体怎么操作摸了半天
 感觉这对初学者很友好。之前写零基础学node时,理解这些具体怎么操作摸了半天
一直以来用Django做后台的API,感觉挺好用,今天才知道管理界面原来可以美化Σ(っ °Д °;)っ
博主,读完博,我在国家计算机网络应急技术处理协调中心等你。
我在美团外卖车上等你(哈哈哈
博主是北邮那个院的
网研
pycharm 这个开发Python确实不错,不过感觉有点重,而且需要破解啊OωO
学生可以免费,实在不行用社区版也够用了
社区版本是木有web开发的鸭
似乎是这样的
表情包好评2333 
 
(手机 Chrome fancybox 点击图片后,点旁边空白退出预览就回到页面顶部了。
确实有点问题,一直没管