跳至主要内容

django2 博客入门1 后端


在pycharm中创建项目trydjango(名称随意),然后在终端中运行
pip install Django==3.0.2

安装django后,得到django-admin管理工具,它可以为新项目创建模板布局或将应用程序添加到现有项目
django-admin

查看django安装版本
django-admin version
python -m django --version

查看所安装的软件版本
pip freeze
查看所有的软件包
pip list

安装Django后,您可以使用以下命令创建项目(.代表不会出现文件夹名嵌套,不建议使用.)
django-admin startproject HelloWorld .


trydjango 项目文件夹
|-- HelloWorld 项目的容器
|   |-- __init__.py 一个空文件,告诉 Python 该目录是一个 Python 包。
|   |-- settings.py 该 Django 项目的设置/配置。
|   |-- urls.py 该 Django 项目的 URL 声明; 一份由 Django 驱动的网站"目录"。
|   `-- wsgi.py          一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。
|--db.sqlite3  sqlite3数据库文件
`-- manage.py  一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互。


启动开发服务器(需要在有manage.py的目录下运行)
python manage.py runserver

端口号默认为 8000,使用Web浏览器访问http://127.0.0.1:8000/验证
页面出现The install worked successfully! Congratulations!即表示安装成功

此命令可在端口8080上启动服务器,0.0.0.0 让其它电脑可连接到开发服务器
python manage.py runserver 0.0.0.0:8080

要创建应用程序,请确保您与manage.py位于同一目录中,cd trydjango
在新增终端里输入
python manage.py startapp blog
django-admin startapp blog


trydjango
|-- blog 应用
| |--migrations
| `-- __init__.py
| |-- __init__.py
| |-- admin.py
| |-- apps.py
| |-- models.py
| |-- tests.py
| `-- views.py
|
|-- HelloWorld
|   |-- __init__.py
|   |-- settings.py
|   |-- urls.py
|   `-- wsgi.py
|--db.sqlite3 
`-- manage.py 

写第一个页面(视图)。打开文件trydjango/blog/views.py
from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the blog index.")

也可以这样写
from django.shortcuts import render

def index(request):
    context = {}
    context['hello'] = 'Hello World!'
    return render(request, 'blog/hello.html', context)

可以看到,我们这里使用 render 来替代之前使用的 HttpResponse。render 还使用了一个字典 context 作为参数。
context 字典中元素的 "hello"键值 对应了模板中的变量 "{{ hello }}"
依次新增文件夹,在trydjango\blog\templates\blog中创建hello.html文件
trydjango
|-- blog
| |--templates
| |--blog
| `--hello.html
`    


编辑trydjango\blog\templates\blog\hello.html,添加
<h1>{{ hello }}</h1>



绑定URL与视图函数
在blog目录中创建URLconf,代码可参考trydjango\HelloWorld\urls.py,在trydjango\blog\路径下创建一个名为urls.py
trydjango
|-- blog 应用
| | :
| |-- urls.py
|
|-- HelloWorld
|    :
|   |-- urls.py
|   
`

该trydjango\blog\urls.py文件中包含以下代码:
from django.urls import path
from blog import views

urlpatterns = [
    path('', views.index, name='blog-index'),
]

Django path()函数可以接收四个参数,分别是两个必选参数:route、view 和两个可选参数:kwargs、name。
语法格式:
path(route, view, kwargs=None, name=None)
  route: 字符串,表示 URL 规则,与之匹配的 URL 会执行对应的第二个参数 view。
  view: 用于执行与正则表达式匹配的 URL 请求。
  kwargs: 视图使用的字典类型的参数。
  name: 用来反向获取 URL。


将根URLconf指向blog.urls模块。在trydjango\HelloWorld\urls.py中添加
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('blog/', include('blog.urls')),
    path('admin/', admin.site.urls),
]


激活应用

编辑 trydjango\HelloWorld\settings.py 文件前,
先设置LANGUAGE_CODE = 'zh-cn'  已改为 'zh-Hans'
TIME_ZONE 为你自己时区
https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
TIME_ZONE = 'Asia/Shanghai'


INSTALLED_APPS = (
   'django.contrib.admin', 管理员站点
   'django.contrib.auth', 认证授权系统
   'django.contrib.contenttypes', 内容类型框架
   'django.contrib.sessions', 会话框架
   'django.contrib.messages', 消息框架
   'django.contrib.staticfiles',           管理静态文件的框架
   'blog.apps.BlogConfig', 添加此项,取自trydjango/blog/apps.py
)

trydjango/blog/apps.py文件内容如下:
from django.apps import AppConfig


class BlogConfig(AppConfig):
    name = 'blog'
    verbose_name = '博客' 别名,可用于汉化





编辑 trydjango/blog/models.py 文件
创建三个模型:类别Category、标签Tag和帖子Post

Django 要求模型必须继承 models.Model 类。

通过一个内嵌类“class Meta”给你的model定义元数据
模型的元数据,指的是“除了字段外的所有内容”,例如排序方式、数据库表名、人类可读的单数或者复数名等等
Meta类用来汉化,verbose_name(详细名称),plural(复数,带s时候会用到)
class Meta:
  verbose_name = '别名'
  verbose_name_plural = verbose_name

类中的__str__方法是在打印类的实例对象object()时,调用该方法,返回自定义字符串
def __str__(self):
    return self.name

类别Category
    Category 只需要一个简单的类别名 cname 就可以了。
    CharField 指定了分类名 cname 的数据类型,CharField 是字符型,
    CharField 必须加的 max_length 参数指定其最大长度,超过这个长度的分类名就不能被存入数据库。

标签Tag
  只需要一个简单的标签名 tname

帖子Post
    title  标题
    content  正文使用了TextField来存储大段文本,存储比较短的字符串可以使用 CharField

    created_time  创建时间,存储时间的字段用 DateTimeField 类型。
    modified_time  最后一次修改时间,存储时间的字段用 DateTimeField 类型。

    在这里把Post对应的数据库表和Category、Tag对应的数据库表关联了起来,但是关联形式稍微有点不同。
    category  对于类别来说,一篇文章通常只能对应一个类别,但是一个类别下可以有多篇文章,
    所以我们使用的是 ForeignKey,即一对多的关联关系。on_delete=models.CASCADE
ForeignKey 在后台中以选择框 <select> 的形式展示

    tags   对于标签来说,一篇文章可以有多个标签,同一个标签下也可能有多篇文章,
     所以我们使用 ManyToManyField,表明这是多对多的关联关系。
     同时我们规定文章可以没有标签,因此为标签 tags 指定了 blank=True。


则trydjango/blog/models.py文件中包含以下代码
from django.db import models
from django.utils import timezone


# Create your models here.
class Category(models.Model):
  cname = models.CharField(verbose_name='类别', max_length=20)

  class Meta:
    verbose_name = '类别'
    verbose_name_plural = verbose_name

  def __str__(self):
  return self.cname


class Tag(models.Model):
  tname = models.CharField(verbose_name='标签', max_length=20)

  class Meta:
    verbose_name = '标签'
    verbose_name_plural = verbose_name

  def __str__(self):
  return self.tname


class Post(models.Model):
  title = models.CharField(verbose_name='标题', max_length=100)
  content = models.TextField(verbose_name='正文', default='')
  created_time = models.DateTimeField(verbose_name='创建时间', default=timezone.now)
  modified_time = models.DateTimeField(verbose_name='修改时间', auto_now=True)
    is_published = models.BooleanField(verbose_name='是否发布', default=True)
  category = models.ForeignKey(Category, verbose_name='类别', on_delete=models.CASCADE)
  tags = models.ManyToManyField(Tag, verbose_name='标签', blank=True)
  class Meta:
        ordering = ['created_time']
    verbose_name = '帖子'
    verbose_name_plural = verbose_name

  def __str__(self):
        return self.title


迁移数据库
每当我们创建模型,删除模型或更新我们项目的任何models.py中的任何内容时。我们需要运行两个命令makemigrations和migrate。makemigrations基本上会为预安装的应用程序(可以在settings.py中的已安装应用程序中查看)和您在已安装的应用程序中添加的新创建的应用程序模型生成SQL命令,而migration会在数据库文件中执行这些SQL命令。

分别运行下面两条命令
python manage.py makemigrations
python manage.py migrate

默认开启的某些应用需要至少一个数据表,所以在使用他们之前需要在数据库中创建一些表
创建数据库和表的命令
python manage.py migrate
这个 migrate 命令检查 INSTALLED_APPS 设置,为其中的每个应用创建需要的数据表

改变模型需要这三步:
编辑 models.py 文件,改变模型。
运行 python manage.py makemigrations 为模型的改变生成迁移文件。
运行 python manage.py migrate 来应用数据库迁移,在数据库里创建新定义的模型的数据表。

sqlmigrate 命令接收一个迁移的名称,然后返回对应的 SQL
python manage.py sqlmigrate blog 0001
sqlmigrate 命令并没有真正在你的数据库中的执行迁移 - 它只是把命令输出到屏幕上


创建一个管理员账号(需要先迁移数据库)
python manage.py createsuperuser

python manage.py runserver
管理员登录界面
http://127.0.0.1:8000/admin/



向管理页面中加入博客应用并管理帖子Post对象
fields
  决定Model的form中包括哪些字段,不能指定不可编辑的字段

exclude
  决定Model的form中排除哪些字段

list_display
  在管理员的更改列表页面上显示字段。不支持ManyToManyField字段
  如果未设置list_display,管理站点将显示一列,显示__str__()每个对象的表示形式。
  如果字段是ForeignKey,Django将显示 __str__()相关对象。
  如果字段是BooleanField,Django将显示一个漂亮的“开”或“关”图标而不是True或False。

list_display_links
  默认情况下,更改列表页面会将第一列(指定的第一个字段)链接到每个项目的更改页面。
  将其设置None为根本没有链接
  必须在list_display

list_editable
  字段在列表页面上显示为表单小部件,允许用户一次编辑和保存多个行

list_filter
  为激活管理员更改列表页面右侧边栏中的过滤器

ordering
  为指定如何在Django管理视图中排序对象列表。这应该是与模型ordering参数格式相同的列表或元组。
  ['升序'] 、['-降序']、['?随机'] 、['-降序', '升序']

search_fields
  在管理员更改列表页面上启用搜索框

actions_on_top = True
actions_on_bottom = False
  控制操作栏显示在页面上的位置


list_per_page
  为控制每个分页管理员更改列表页面上显示的项目数。默认情况下,此设置为100。

list_max_show_all
  控制“显示全部”管理员更改列表页面上可显示的项目数。仅当总结果计数小于或等于此设置时,管理员才会在更改列表中显示“全部显示”链接。默认情况下,此设置为200。

打开 trydjango/blog/admin.py 文件
from django.contrib import admin
from blog.models import Post, Category, Tag

# Register your models here.

class CategoryAdmin(admin.ModelAdmin):
    list_display = ('id', 'cname')
    ordering = ['id']


class TagAdmin(admin.ModelAdmin):
    list_display = ('id', 'tname')


class PostAdmin(admin.ModelAdmin):
    fields = (('title', 'category'), 'content', 'created_time', 'tags', 'is_published')
    exclude = ('modified_time',)
    list_display = ('title', 'category', 'created_time', 'modified_time', 'is_published')
    list_display_links = ('title',)
    list_editable = ('created_time',)
    list_filter = ('created_time', 'modified_time')
    ordering = ['-modified_time']
    search_fields = ['title']
    actions_on_top = False
    actions_on_bottom = True
    actions_selection_counter = True
    list_per_page = 6
    list_max_show_all = 200


# Register your models here.
admin.site.register(Category, CategoryAdmin)
admin.site.register(Tag, TagAdmin)
admin.site.register(Post, PostAdmin)

#取消注册 admin.site.unregister()
#添加标题 admin.site.site_header = "hello"






评论

此博客中的热门博文

学习地址

清华大学计算机系课程攻略 https://github.com/PKUanonym/REKCARC-TSC-UHT 浙江大学课程攻略共享计划 https://github.com/QSCTech/zju-icicles https://home.unicode.org/ 世界上的每个人都应该能够在手机和电脑上使用自己的语言。 http://codecanyon.net   初次看到这个网站,小伙伴们表示都惊呆了。原来代码也可以放在网上卖的?!! 很多coder上传了各种代码,每个代码都明码标价。看了下销售排行,有的19刀的卖了3万多份,额di神啊。可以看到代码的演示效果,真的很漂亮。代码以php、wordpress主题、Javascript、css为主,偏前台。 https://www.lintcode.com/ 算法学习网站,上去每天刷两道算法题,走遍天下都不怕。 https://www.codecademy.com/ 包含在线编程练习和课程视频 https://www.reddit.com/ 包含有趣的编程挑战题,即使不会写,也可以查看他人的解决方法。 https://ideone.com/ 在线编译器,可运行,可查看代码示例。 http://it-ebooks.info/ 大型电子图书馆,可即时免费下载书籍。 刷题 https://github.com/jackfrued/Python-100-Days https://github.com/kenwoodjw/python_interview_question 面试问题 https://github.com/kenwoodjw/python_interview_question https://www.journaldev.com/15490/python-interview-questions#python-interpreter HTTP 身份验证 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Authentication RESTful 架构详解 https://www.runoob.com/w3cnote/restful-architecture.html https://www.rosettacode.org/wiki/Rosetta_C...

PDF处理

虚拟pdf打印机 pdfFactory  https://fineprint.com PDFCreator  https://www.pdfforge.org 开源 cutepdf https://www.cutepdf.com/index.htm Doro PDF Writer http://www.the-sz.com/products/doro PdfScribe  https://github.com/stchan/PdfScribe/releases pdf阅读器 Sumatra PDF https://www.sumatrapdfreader.org/ 为什么 Python 用于 PDF 处理  如您所知,PDF 处理属于文本分析。 大多数文本分析库或框架仅使用 Python 设计。 这为文本分析提供了优势。 还有一件事,您永远无法在现有的机器学习或自然语言处理框架中直接处理 pdf。 除非他们为此证明了显式接口。 我们必须先将pdf转换为文本。 我们可以使用下述任何库轻松实现这一点。 在线转换pdf Sejda https://www.sejda.com/pdf-editor 每个文档 200 页的免费限制 https://www.pdf2go.com/ https://tools.pdfforge.org/extract-text PDF24 Tools https://tools.pdf24.org/zh/ 免费且易于使用的在线PDF工具 FreeOCR http://www.paperfile.net/ 适用于Windows的免费光学字符识别软件,支持大多数Twain扫描仪的扫描,还可以打开大多数扫描的PDF和多页Tiff图像以及流行的图像文件格式,FreeOCR输出纯文本,可以直接导出为Microsoft Word格式。 不支持中文 wkhtmltopdf 和 wkhtmltoimage 是使用 QT Webkit 渲染引擎将 HTML 渲染为 PDF 和各种图像格式的命令行工具。这些完全“无头”运行,不需要显示或显示服务。 https://wkhtmltopdf.org/ django-wkhtmltopdf 允许 Django 站点输出动态 PDF。它利用 wkhtmltopdf 库,允许您使用您知道...

安卓 之 apk下载、ADB、 scrcpy

Apk下载 下载离线安装apk https://www.apkmirror.com/ 免费和安全的Android APK下载 https://apkpure.com/ 被暴雷,有植入 https://apps.evozi.com/apk-downloader/ 可以将Google Play( https://play.google.com )中的apk文件所在网址直接下载到台式机和设备上 https://f-droid.org/zh_Hans/ F-Droid 是一个 Android 平台上 FOSS(Free and Open Source Software,自由开源软件)的目录,并提供下载安装支持。使用客户端可以更轻松地浏览、安装及跟进设备上的应用更新。 https://gitlab.com/AuroraOSS/AuroraStore Aurora商店 是Google Play商店的非官方FOSS客户,设计典雅。 Aurora商店不仅下载,更新和搜索Play商店等应用 https://github.com/OpenTracksApp/OpenTracks OpenTracks是一款运动跟踪应用程序,完全尊重您的隐私。 Tasker https://tasker.joaoapps.com/ 是一款适用于Android的应用程序,它可以根据用户定义的配置文件中的上下文、可点击或定时的主屏幕小部件来执行任务。它无需root或特殊的主屏幕就能控制Android设备。 AsciiCam AsciiCam可以从您的相机指向的任何位置实时生成ASCII图像。选择黑白,原色或全彩,拍照,并将其作为图像或HTML共享。您还可以在库中创建ASCII版本的图片,并且每次使用标准相机应用程序拍摄照片时,也可以选择自动生成ASCII版本。 AsciiCam是完全免费和开源的。 Apk1安装器 优化微信apk文件接收体验。 微信收到apk文件会加 ".1" 后缀导致打不开,必须自己手动找到文件重命名去掉后缀。 使用本安装器就可以在微信内,潇洒地点击直接打开。甚至可以在安装器内浏览apk1文件历史接收记录。 ADB ADB全名是 Android Debug Bridge,是开发或使用Android时很常用的工具。可以从电脑通过USB连线到Android手机上 https:...