跳至主要内容

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://pyperclip.readthedocs.io/en/latest/ import pyperclip while True :     # pyperclip.copy('Hello, world!')     # pyperclip.paste()     # pyperclip.waitForPaste()     print ( pyperclip. waitForNewPaste ( ) )     # 获取要输入新的坐标,也可以通过autohotkey import time import pyautogui  as pag import os   try :     while True :         print ( "Press Ctrl-C to end" )         x , y = pag. position ( )   # 返回鼠标的坐标         posStr = "Position:" + str ( x ) . rjust ( 4 ) + ',' + str ( y ) . rjust ( 4 )         print ( posStr )   # 打印坐标         time . sleep ( 0.2 )         os . system ( 'cls' )   # 清楚屏幕 except KeyboardInterrupt :     print ( 'end....' )     # 打印消息 import pyautogui import time import pyperclip   content = """   呼叫龙叔! 第二遍! 第三遍! 第四遍...

学习地址

清华大学计算机系课程攻略 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...

mysql 入门

资料 https://dinfratechsource.com/2018/11/10/how-to-install-latest-mysql-5-7-21-on-rhel-centos-7/ https://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html https://www.runoob.com/mysql/mysql-create-database.html https://www.liquidweb.com/kb/install-java-8-on-centos-7/ 工具 https://www.heidisql.com/ HeidiSQL是免费软件,其目标是易于学习。 “ Heidi”使您可以从运行数据库系统MariaDB,MySQL,Microsoft SQL或PostgreSQL的计算机上查看和编辑数据和结构 MySQL 连接时尽量使用 127.0.0.1 而不是 localhost localhost 使用的 Linux socket,127.0.0.1 使用的是 tcp/ip 为什么我使用 localhost 一直没出问题 因为你的本机中只有一个 mysql 进程, 如果你有一个 node1 运行在 3306, 有一个 node2 运行在 3307 mysql -u root -h localhost -P 3306 mysql -u root -h localhost -P 3307 都会连接到同一个 mysql 进程, 因为 localhost 使用 Linux socket, 所以 -P 字段直接被忽略了, 等价于 mysql -u root -h localhost mysql -u root -h localhost 而 -h 默认是 localhost, 又等价于 mysql -u root mysql -u root 为了避免这种情况(比如你在本地开发只有一个 mysql 进程,线上或者 qa 环境有多个 mysql 进程)最好的方式就是使用 IP mysql -u root -h 127 .0 .0 .1 -P 3307 strac...