Django入门基础详解

版权声明:编写不易,可看不可转,请知悉! https://blog.csdn.net/zha6476003/article/details/83045800

本次使用django版本2.1.2

安装django

安装最新版本

pip install django

安装指定版本

pip install django==1.10.1

查看本机django版本

pip show django

创建项目

创建一个项目文件夹(如:django),在此文件夹中打开Powershell 或 打开DOS切换到此目录执行如下命令:

django-admin startproject my_site

  • django-admin startproject:是固定的创建项目命令
  • my_site:是创建的项目名称,自己随意取名

当执行创建项目名称后django会自动生成那些必要的文件,也可以执行django-admin startproject Blog .创建一个Python的包。

启动项目
进入django/my_site文件执行以下命令:

django manage.py runserver
D:\xuexi\python\django\my_site> 
>>> python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).

You have 15 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

October 14, 2018 - 11:48:52
Django version 2.1.2, using settings 'my_site.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

也可以指定端口:python manage.py runserver 127.0.0.1:8081

根据运行后的提示访问http://127.0.0.1:8000

更改Django默认语言

上面访问后页面是英语感觉看着不习惯,后面会讲到管理页面也是英语,如下我们来更改配置实现中文展示:

  1. 进入D:\xuexi\python\django\my_site\my_site\settings.py搜索LANGUAGE_CODE大概长这样:

    ## 其它配置代码...
    
    LANGUAGE_CODE = 'en-us'
    TIME_ZONE = 'UTC'
    
    ## 其它配置代码...
    

    变更为:

    ## 其它配置代码...
    
    LANGUAGE_CODE = 'zh-hans'  # 把英文改为中文
    
    TIME_ZONE = 'Asia/Shanghai'  # 把国际时区改为中国时区
    
    ## 其它配置代码...
    
  2. 保存文件 -> 刷新浏览器

创建应用

项目已经创建好了,网站也有了,接下来要实现网站的具体功能。在Django中,通常把这些功能称为“应用”(application)。
进入刚才创建的项目目录中,即manage.py文件所在目录,然后执行下面代码:

D:\xuexi\python\django\my_site> 
>>> python manage.py startapp blog

执行后的目录结构:

blog就是在项目my_site中新建的项目。当新的应用创建后,Django会自动在这个应用中增加一些文件。目前这已经是一个相对完善的网站结构。

目录作用详解

django常用命令

详解地址1

详解地址2

网站配置(应用注册到项目)

前面仅仅是创建了应用,还没有将应用注册到本项目中,因此暂时不能访问。

在Django项目中,在./my_site/setting.py文件中进行信息注册,setting.py常用配置如下:

  • DEBUG: 其值为True 或者False,在开发过程中需要设置成True,在测试功能时,Django能够显示详细的报错信息–这是“开发模式”。如果将项目部署到真正要对外发布的服务器上,我们称之为“生产环境”,必须将其值修改为False,从而避免暴露项目的内部信息。

  • ALLOWED_HOSTS: 在DEBUG为True时,其值为空。当部署到生产环境中时,要把主域名填写到这里,才能通过域名访问到本站。

  • INSTALLED_APPS: 这是一个非常重要的配置项,所有的应用只有写到这里才能生效。默认情况下,已经有了一些应用,比如django.contrib.admin就是针对项目后台管理的应用。如我们前面新建了一个blog应用,那我们就需要把应用配置到这里,如下:

    	INSTALLED_APPS = [
    	    'django.contrib.admin',
    	    'django.contrib.auth',
    	    'django.contrib.contenttypes',
    	    'django.contrib.sessions',
    	    'django.contrib.messages',
    	    'django.contrib.staticfiles',
    	    'blog',  # <---------------------新增的应用添加到下方格式跟上面其他应用一样,'xxx',
    	]
    
  • DATAVASES: 在这里可以配置数据库。Django能够支持多种数据库,如常见的MySQL、Oracle等。默认配置SQLite,因为这个数据库小巧灵活,还是Python标准库所支持的。

  • LANGUAGE_CODE: 设置项目的语言,一般情况下可以不用修改,如果非要用汉语,则设置为LANGUAGE_CODE=‘zh-hans’(注意不是’zh-cn’)。

  • TIME_ZONE: 设置时区,通常使用东八区,设置为’Asia/Shanghai’.

数据模型类(迁移数据库)

利用Django开发网站系统,一般情况下,要先编写数据模型,就是在./blog/models.py中写一个类,这个类与数据库表具有对应关系,Django中我们不需要执行sql语句来创建表,它已经帮我们做了一些事情。Django 把那一套数据库的语法转换成了 Python 的语法形式,我们只要写 Python 代码就可以了,Django 会把 Python 代码翻译成对应的数据库操作语言。用更加专业一点的说法,就是 Django 为我们提供了一套 ORM(Object Relational Mapping)系统。

blog/models.py

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User


class BlogArticles(models.Model):
    """
    Django 要求模型必须继承 models.Model 类。
    CharField 指定了分类名  title 的数据类型,CharField 是字符型,
    CharField 的 max_length 参数指定其最大长度,超过这个长度的分类名就不能被存入数据库。
    当然 Django 还为我们提供了多种其它的数据类型,如日期时间类型 DateTimeField、整数类型 IntegerField 等等。
    Django 内置的全部类型可查看文档:
    https://docs.djangoproject.com/en/1.10/ref/models/fields/#field-types
    """
    title = models.CharField(max_length=300)  # 设置为字符类型最大输入长度为30
    author = models.ForeignKey(User,related_name='blog_posts, on_delete=models.CASCADE')  # 一对多关系(一个用户可以创建多篇文章),on_delete在Django2.x以上必须写这个参数(大概意思是删除这个外键时删除其他表对应的数据)

    """
    这里 User 是从 django.contrib.auth.models 导入的。
    django.contrib.auth 是 Django 内置的应用,专门用于处理网站用户的注册、登录等流程,User 是 Django 为我们已经写好的用户模型。
    这里我们通过 ForeignKey 把文章和 User 关联了起来。
    因为我们规定一篇文章只能有一个作者,而一个作者可能会写多篇文章,因此这是一对多的关联关系,和 Category 类似。
    """
    body = models.TextField()  # 设置为文本字段
    publish = models.DateTimeField(default=timezone.now)  # 默认本地时间

    class Meta:
        ordering = ('-publish',)  # 设置BlogArticles的实例对象按照publish字段的倒叙显示

    def __str__(self):
        return self.title

BlogArticles就是一个标准的 Python 类,它继承了models.Model类,类名为 BlogArticles 。BlogArticles类有一个属性 title,它是models.CharField的一个实例。
这样,Django 就可以把这个类翻译成数据库的操作语言,在数据库里创建一个名为 BlogArticles的表格,可以看出从 Python 代码翻译成数据库语言时其规则就是一个 Python 类对应一个数据库表格,类名即表名,类的属性对应着表格的列,属性名即列名。

BlogArticles的数据模型编写好了,将来的数据表的基本结构就是按照上述各字段及其属性而定的,接下来根据数据模型建立数据库表,执行以下命令:

开始迁移

1、在./my_site/manage.py执行python manage.py makemigrations命令

D:\xuexi\python\django\my_site (master)
>>> python manage.py makemigrations
Migrations for 'blog':
  blog\migrations\0001_initial.py
    - Create model BlogArticles
  • 当我们执行了 python manage.py makemigrations后,Django 在 blog 应用的 migrations 目录下生成了一个 0001_initial.py文件,这个文件是 Django 用来记录我们对模型做了哪些修改的文件。目前来说,我们在 models.py文件里创建了1个模型类,Django 把这些变化记录在了 0001_initial.py 里

我们也可以使用manage.py来查看以下转换后的预执行内如:

D:\xuexi\python\django\my_site (master)
>>> python manage.py sqlmigrate blog 0001
BEGIN;
--
-- Create model BlogArticles
--
CREATE TABLE "blog_blogarticles" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(300) NOT NULL, "body" text NOT NULL, "publish" datetime NOT NULL, "author_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED);
CREATE INDEX "blog_blogarticles_author_id_ed798e23" ON "blog_blogarticles" ("author_id");
COMMIT;

可以看到转换后其实就是一些建表语句而已。

2、继续执行python manage.py migrate命令

D:\xuexi\python\django\my_site (master)
>>> python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying blog.0001_initial... OK
  Applying sessions.0001_initial... OK
  • 第一步只是告诉了 Django 我们做了哪些改变,为了让 Django 真正地为我们创建数据库表,接下来又执行了python manage.py migrate命令。Django 通过检测应用中 migrations目录下的文件,得知我们对数据库做了哪些操作,然后它把这些操作翻译成数据库操作语言,从而把这些操作作用于真正的数据库(说白了就是这两个步骤把我们在models.py里面写的python语句翻译成sql并执行)。

3、使用管理打开我们项目中的db.sqlite3文件:
Firefox安装sqlite工具插件(注意安装插件时使用Firefox打开链接)

从上面看出django已成功帮我创建了数据表。

发布博客文章

1、首先执行python manage.py createsuperuser创建超级管理员

D:\xuexi\python\django\my_site (master)
>>> python manage.py createsuperuser
用户名 (leave blank to use 'xxxx'): admin
电子邮件地址: [email protected]
Password:
Password (again):
这个密码太常见了。
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.

2、执行python manage.py runserver启动服务

                                                          
D:\xuexi\python\django\my_site (master)          
>>> python manage.py runserver                              
Performing system checks...                               
                                                          
System check identified no issues (0 silenced).           
October 16, 2018 - 22:25:14                               
Django version 2.1.2, using settings 'my_site.settings'   
Starting development server at http://127.0.0.1:8000/     
Quit the server with CTRL-BREAK.                          

3、使用浏览器访问http://localhost:8000/admin/,输入前面创建的超级管理员账户和密码。

登陆后大概长这样:

界面所显示的用户和组都是应用中默认的。

4、在后台注册自己创建的模型,在以下路径./django/my_site/blog/admin.py文件中添加以下代码

from django.contrib import admin

# Register your models here.

from django.contrib import admin
from .models import BlogArticles  # 将BlogArticles引入到当前环境
admin.site.register(BlogArticles)  # 将BlogArticles注册到admin

再次刷新浏览器,查看我们新注册的模型已经可以在后台管理页面看到了,如下图:

点击增加一篇文章

sqlite中也可以看到我们在管理平台看到的数据了

5、添加文章后页面显示看着挺单一,现在来改变admin.py让页面编的不在那么单调,具体代码如下:

from django.contrib import admin

# Register your models here.

from django.contrib import admin
from .models import BlogArticles  # 将BlogArticles引入到当前环境


class BlogArticlesAdmin(admin.ModelAdmin):  #
    list_display = ("title", "author", "publish")  # 管理页面需要展示的字段
    list_filter = ("publish", "author")  # 设置(页面右侧)可以publish 和 author过滤
    search_fields = ("title", "body")  # 设置页面支持title 和 body搜索
    raw_id_fields = ("author",)
    date_hierarchy = "publish"  # 设置按可以按时间选择
    ordering = ['publish', 'author']  # 设置以publish 和 author来进行排序


admin.site.register(BlogArticles, BlogArticlesAdmin)  # 将BlogArticles注册到admin

重新刷新页面:

猜你喜欢

转载自blog.csdn.net/zha6476003/article/details/83045800