首页 > 其他 > 详细

Django

时间:2019-12-10 19:34:48      阅读:80      评论:0      收藏:0      [点我收藏+]

Django标准结构:

mysite/
    blog/
        migrations
        admin.py
        apps.py
        models.py
        tests.py
        views.py  #视图
    mysite/
        asgi.py
        settings.py  #配置文件
        urls.py #路由文件
        wsgi.py
    static
    templates/
        login.html
    venv

创建项目:

django-admin startproject mysite

启动服务器:

python manage.py runserver 8080

创建app应用:

python manage.py startapp blog

编写视图:

blog/views.py

from django.shortcuts import HttpResponse, render, redirect
import re
    # request保存了所有和用户浏览器请求相关的数据
def login(request):
    ##如果是post请求,就是提交数据
    if request.method == 'POST':
        phone_number = request.POST.get("phone", None)
        passwd = request.POST.get("pwd", None)
        if re.match('^(13|14|15|18)[0-9]{9}$', phone_number) and passwd == "123456":
            # return redirect("https://www.baidu.com")  # 跳转到指定的url
            return HttpResponse("登录成功")
    error_msg = "账号或者密码错误,请重新登录"
    return render(request, 'login.html', {'error' : error_msg})

添加路由

为了调用该视图,我们还需要编写路由路径。在polls目录中新建urls.py(blog/views.py):

from django.urls import path
from . import views

urlpatterns = [
    path('', views.login, name='login'),
]

接下来,在项目的主urls.py文件中添加urlpattern条目,指向我们刚才建立的app独有的urls文件,这里需要导入include模块。打开mysite/urls.py文件,代码如下:

from django.contrib import admin
from django.urls import path, include

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

建议:除了admin路由外,尽量给每个app设计自己独立的二级路由

数据库配置

# mysite/settings.py

# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

如果你想使用其他的数据库,请先安装相应的数据库操作模块,并将settings文件中DATABASES位置的’default’的键值进行相应的修改,用于连接你的数据库。其中:

ENGINE(引擎):可以是django.db.backends.sqlite3、django.db.backends.postgresql、django.db.backends.mysql、django.db.backends.oracle,当然其它的也行。

NAME(名称):类似Mysql数据库管理系统中用于保存项目内容的数据库的名字。如果你使用的是默认的SQLite,那么数据库将作为一个文件将存放在你的本地机器内,此时的NAME应该是这个文件的完整绝对路径包括文件名,默认值os.path.join(BASE_DIR, ’db.sqlite3’),将把该文件储存在你的项目目录下。

如果你不是使用默认的SQLite数据库,那么一些诸如USER,PASSWORD和HOST的参数必须手动指定!下面给出一个基于pymysql操作Mysql数据库的例子,更多细节参考后续的数据库章节。

# mysite/settings.py

# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases

import pymysql         # 一定要添加这两行!通过pip install pymysql!
pymysql.install_as_MySQLdb()

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mysite',
        'HOST': '192.168.1.1',
        'USER': 'root',
        'PASSWORD': 'pwd',
        'PORT': '3306',
    }
}

创建模型

# polls/models.py

from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

上面的代码非常简单明了。每一个类都是django.db.models.Model的子类。每一个字段都是Field类的一个实例,例如用于保存字符数据的CharField和用于保存时间类型的DateTimeField,它们告诉Django每一个字段保存的数据类型。

每一个Field实例的名字就是字段的名字(如: question_text 或者 pub_date )。在你的Python代码中会使用这个值,你的数据库也会将这个值作为表的列名。

你也可以在每个Field中使用一个可选的第一位置参数用于提供一个人类可读的字段名,让你的模型更友好,更易读,并且将被作为文档的一部分来增强代码的可读性。

一些Field类必须提供某些特定的参数。例如CharField需要你指定max_length。这不仅是数据库结构的需要,同样也用于数据验证功能。

有必填参数,当然就会有可选参数,比如在votes里我们将其默认值设为0.

最后请注意,我们使用ForeignKey定义了一个外键关系。它告诉Django,每一个Choice关联到一个对应的Question(注意要将外键写在‘多’的一方)。Django支持通用的数据关系:一对一,多对一和多对多

引用app

上面的代码看着有点少,其实包含了大量的信息,据此,Django会做下面两件事:

1.创建该app对应的数据库表结构
2.为Question和Choice对象创建基于Python的数据库访问API
但是,首先我们得先告诉Django项目,我们要使用app。

要将应用添加到项目中,需要在INSTALLED_APPS设置中增加指向该应用的配置文件的链接。对于本例的投票应用,它的配置类文件PollsConfig是blog/apps.py,所以它的点式路径为blog.apps.BlogConfig。我们需要在INSTALLED_APPS中,将该路径添加进去:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog.apps.BlogConfig', #'blog', 也可以
]

启动模型

记录修改 makemigrations

python manage.py makemigrations blog
(venv) E:\Django\mysite>python manage.py makemigrations blog
Migrations for 'blog':
  blog\migrations\0001_initial.py
    - Create model Question
    - Create model Choice

通过运行makemigrations命令,Django 会检测你对模型文件的修改,也就是告诉Django你对模型有改动,并且你想把这些改动保存为一个“迁移(migration)”。

migrations是Django保存模型修改记录的文件,这些文件保存在磁盘上。在例子中,它就是polls/migrations/0001_initial.py,你可以打开它看看,里面保存的都是人类可读并且可编辑的内容,方便你随时手动修改。

展示SQL语句 sqlmigrate

接下来有一个叫做migrate的命令将对数据库执行真正的迁移动作。但是在此之前,让我们先看看在migration的时候实际执行的SQL语句是什么。有一个叫做sqlmigrate的命令可以展示SQL语句,例如:

python manage.py sqlmigrate blog 0001

运行结果:

(venv) E:\Django\mysite>python manage.py sqlmigrate blog 0001
BEGIN;
--
-- Create model Question
--
CREATE TABLE "blog_question" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL);
--
-- Create model Choice
--
CREATE TABLE "blog_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL, "question_id" integer NOT
 NULL REFERENCES "blog_question" ("id") DEFERRABLE INITIALLY DEFERRED);
CREATE INDEX "blog_choice_question_id_a5be0596" ON "blog_choice" ("question_id");
COMMIT;

(venv) E:\Django\mysite>

检查项目中的错误

(venv) E:\Django\mysite>python manage.py check
System check identified no issues (0 silenced).

迁移 migrate

(venv) E:\Django\mysite>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
  Applying blog.0001_initial... OK

migrate命令对所有还未实施的迁移记录进行操作,本质上就是将你对模型的修改体现到数据库中具体的表上面。Django通过一张叫做django_migrations的表,记录并跟踪已经实施的migrate动作,通过对比获得哪些migrations尚未提交。

改模型时的操作分三步:
1.在models.py中修改模型;
2.运行python manage.py makemigrations为改动创建迁移记录;
3.运行python manage.py migrate,将操作同步到数据库。

使用模型的API

Django

原文:https://www.cnblogs.com/orange-lsc/p/12018254.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!