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
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支持通用的数据关系:一对一,多对一和多对多
上面的代码看着有点少,其实包含了大量的信息,据此,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', 也可以
]
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,你可以打开它看看,里面保存的都是人类可读并且可编辑的内容,方便你随时手动修改。
接下来有一个叫做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).
(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,将操作同步到数据库。
原文:https://www.cnblogs.com/orange-lsc/p/12018254.html