首页 Django开始
文章
取消

Django开始

前言

  最近一直在研究一些AI相关的东西,因为AI很多都是 python 实现的,所有也顺带研究一下 python 和相关的框架。之前也经常会写一些 python 的代码,但是真的没写过啥项目,都是一些简单的代码。而这次不同,打算用 python 写一个项目练练手,选择了比较著名的 Django 框架。这个框架之前也是了解过的,但是只停留在看看文档的入门部分,觉得不是很难,记得当时还很惊讶与他有一个现成的后台可以用,但是因为一些原因,并没有深入研究,只是单纯的觉得有一个后台可能也不能满足要求。但是这次发现,这个框架很厉害,后台特别灵活,基本可以满足需求。

介绍

  这次通过一个小项目,了解了 Django 的基本使用,并且也了解了一些后台的配置。

  • 项目管理:Django 自带了一个项目管理工具,可以很方便的管理项目。

  • 后台:Django 自带了一个后台,可以很方便的进行后台配置。

  • ORM:Django 自带了一个 ORM,可以很方便的进行数据库操作。真心很好用。不管是对象关系映射还是直接操作数据库,都特别方便。

  • 数据库迁移:Django 自带了一个数据库迁移工具,可以很方便的进行数据库迁移。

项目管理

  Django 自带了一个项目管理工具,可以很方便的管理项目。从项目的创建到开始,一直到项目结束,都可以通过这个项目管理工具来管理项目。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 安装 Django
pip install Django

# 创建项目
django-admin startproject project_name

# 创建应用
python manage.py startapp app_name

# 查看其他命令
python manage.py -h

# 运行项目
python manage.py runserver

# 执行 shell,这个命令可以进入 shell 模式,然后就可以直接操作数据库
python manage.py shell

后台

  Django 自带了一个后台,可以很方便的进行后台配置。执行迁移命令后,就可以通过创建用户来创建一个后台账号,然后就可以通过这个账号登录后台,进行后台配置。这个后台自带用户管理、用户组管理等。第一次接触的时候我觉得这个后台可能并不能满足需求,但是后来发现这个后台还可以自定义,可以很方便的进行后台配置。

激活后台

1
2
3
4
5
6
7
8
# 执行迁移命令
python manage.py migrate

# 创建用户
python manage.py createsuperuser

# 登录后台
# http://127.0.0.1:8000/admin/

后台配置

  Django 自带了一个后台,可以很方便的进行后台配置。而配置的方法是通过 admin.py 文件进行配置的。新创建的模型也可以很简单的加入到后台,让后台管理更方便。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 创建数据库模型
# models.py

from django.db import models


class Reporter(models.Model):
    full_name = models.CharField(max_length=70)

    def __str__(self):
        return self.full_name


class Article(models.Model):
    pub_date = models.DateField()
    headline = models.CharField(max_length=200)
    content = models.TextField()
    reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)

    def __str__(self):
        return self.headline

# 注册后台管理
# admin.py
from django.contrib import admin

from . import models

admin.site.register(models.Article)

更多配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# 这段代码比较乱,是因为没有好的例子,拿一个项目代码放这里了,又不想把代码公开,草草改了一下

from django.contrib import admin
from .models import Post, Tag


# Register your models here.

# 设置后台站点标题
admin.site.site_header = '我的项目'


# 这个可以在创建、编辑文章的页面编辑tag
class TagInline(admin.StackedInline):
    model = Tag
    extra = 0


# 这里还可以用装饰器@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    inlines = [TagInline]
    # 可编辑字段列,这个可以让这些列在列表里呈现可编辑状态
    list_editable = ('title', 'description', "pub_date")
    # 展示列
    list_display = ("id", 'title', 'description', 'pub_date')
    # 连接,列表上下面字段带链接
    list_display_links = ("id", "title")
    # 搜索字段,列表搜索可以模糊搜索的字段
    search_fields = ('title', "description")
    # 过滤列,这个可以在列表右侧有一个过滤功能
    list_filter = ('title')
    # 每页条数
    list_per_page = 10
    # 过滤列,必须多对多字段,这里没有,所有不能用
    # filter_horizontal = ('name',)
    # 设置功能选项在哪里
    actions_on_top = False
    actions_on_bottom = True


# 这里还可以用装饰器@admin.register(Post)
admin.site.register(Post, PostAdmin)


# 这里还可以用装饰器@admin.register(Tag)
class TagAdmin(admin.ModelAdmin):
    # 可编辑字段列
    # list_editable = ('name',)
    # 编辑页面的显示(可分栏显示),这不能有id,这个好理解因为id是隐藏的,
    # 也不能关联“post__name”
    # fields = ('name',)
    # fields = (('name', "post"), ('description',))
    # 还可以为分组设置名字,不可以与fields同时使用(好像没见到效果)
    # fieldsets = (
    #     ("基本信息", {"fields": ['name', "type"]}),
    #     ("描述信息", {"fields": ["post", "description"]}),
    # )
    # # 只读字段
    # readonly_fields = ("name",)
    # 展示列
    list_display = ("id", 'name', 'post__name')
    # 连接
    list_display_links = ("id", "name")
    # 搜索字段
    search_fields = ('name', 'post__name')
    # 过来列
    list_filter = ('post__name', "type")
    # 搜索,'__'表示需要关连到其他表中查询
    # 每页条数
    list_per_page = 10
    # 过滤列,必须多对多字段,这里没有,所有不能用
    # filter_horizontal = ('name',)
    # 设置功能选项在哪里
    actions_on_top = False
    actions_on_bottom = True
    # save栏的位置
    # save_on_top = True
    # 排序 ,'-'表示降序
    ordering = ('-id',)

    """
    处理状态的,这里不涉及作为学习资料
    from django.utils.html import format_html
    status_choices=(
        ('published',u'已出版'),
        ('publishing',u'未出版'),
        ('forbidden',u'禁止出版'),
    )
    status = models.CharField(choices=status_choices,max_length=32,default='publishing')

    def status_color(self):
        if self.status == 'published':
            format_td = format_html('<span style="padding:2px;color:white">已出版</span>')
        if self.status == 'publishing':
            format_td = format_html('<span style="padding:2px;color:white">未出版</span>')
        if self.status == 'forbidden':
            format_td = format_html('<span style="padding:2px;color:white">禁止出版</span>')
        return format_td      # 将html样式传递给admin展示页面

    status_color.short_description = 'status' # admin展示时名称为status(一个别名)
    """


# 这里还可以用装饰器@admin.register(Tag)
admin.site.register(Tag, TagAdmin)

ORM

  Django 的 ORM 模块,可以很方便的进行数据库的操作。可以通过python manage.py shell 进入shell,然后就可以进行数据库的操作了。而且包括一对一、一对多、多对多等关系,使用也很方便。

数据库迁移

  Django 的 ORM 模块,可以很方便的进行数据库的操作。可以通过python manage.py makemigrations 和 python manage.py migrate 进行数据库迁移。只要在models.py中创建或修改了对应的数据库操作,然后执行这两条命令就可以将操作同步到数据库中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 创建数据库模型
# models.py

from django.db import models


class Reporter(models.Model):
    full_name = models.CharField(max_length=70)

    def __str__(self):
        return self.full_name


class Article(models.Model):
    pub_date = models.DateField()
    headline = models.CharField(max_length=200)
    content = models.TextField()
    reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)

    def __str__(self):
        return self.headline

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建数据库迁移
python manage.py makemigrations
# 创建指定app的数据库迁移
python manage.py makemigrations news

# 查看数据库迁移
python manage.py sqlmigrate
# 查看指定app的数据库迁移
python manage.py sqlmigrate news 0001

# 执行数据库迁移
python manage.py migrate
# 执行指定app的数据库迁移
python manage.py migrate news

参考

本文由作者按照 CC BY 4.0 进行授权

端口扫描工具-nmap

大语言模型(一):智能体介绍