本次关于django 3.0 的教程全部是基于 Windows 10 和 Python 3.8 的基础上。
在CMD(命令提示符)中输入以下命令建立一个名为django的虚拟环境。
mkvirtualenv django
建立虚拟环境成功之后,会自动进入虚拟环境。
直接安装django就会是最新的版本,这里我们需要的正是Django 3.0版本。
另外我们使用豆瓣源进行安装,以此来提高安装速度。
pip install django -i https://pypi.douban.com/simple/
继续在CMD中输入以下命令来建立一个名为mysite
的项目。
# 想把项目建立在哪个文件夹中,进入文件夹 (可忽略)
cd Desktop
# 创建项目
django-admin startproject mysite
接下来我们可以进入mysite
文件夹中,来测试项目是否建立成功。
# 进入mysite文件夹
cd mysite
查看mysite
文件夹中有哪些文件。
dir
我们可以看到有一个manage.py
文件,我们运行用以下这个命令运行这个文件即可。
# 默认端口是8000
python manage.py runserver
# 自定义端口
python manage.py runserver 8080
# 其他电脑也可以访问
# 我们要把需要访问电脑得ip地址加入到mysite/settings.py中ALLOWED_HOSTS中
python manage.py runserver 0.0.0.0:8000
如果看到以上界面之后,我们便可以在浏览器中访问http://127.0.0.1:8000/,如果访问成功,便代表项目建立成功。
继续在CMD中输入以下命令来建立一个名为polls
的应用。
python manage.py startapp polls
polls/views.py
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
在polls 目录里新建一个 urls.py
文件
polls/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
在 mysite/urls.py
文件的 urlpatterns
列表里插入一个 include()
mysite/urls.py
from django.contrib import admin
from django.urls import path
from django.urls import include
urlpatterns = [
path('admin/', admin.site.urls),
path('polls/', include('polls.urls')),
]
这样一个简单得视图便完成了。
**接下来我们可以在浏览器中访问。**http://127.0.0.1:8000/polls/
这里我们使用得数据库是MySQL 5.7及以上版本,Python版本是3.8。
首先我们需要安装一个用于连接Python和MySQL得工具包 mysqlclient
pip install mysqlclient
这样得安装方式是无法安装成功的。
在 https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient 中找到对应的版本,可以直接将包下载下来,再进行安装。
mysqlclient
pip install mysqlclient-1.4.6-cp38-cp38-win32.whl
在MySQL中建立名为在MySQL中mysite
的数据库。
mysite/settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysite',
'USER': 'root',
'PORT': 3306,
'PASSWORD': '123456',
'HOST': '127.0.0.1'
}
}
到这里我们完成了数据库的配置。
接下来我们执行命令
python manage.py migrate
我们看到数据库中已经有了默认创建的表,代表数据库配置成功。
polls/models.py
import datetime
from django.db import models
# Create your models here.
from django.utils import timezone
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
mysite/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 激活模型
'polls.apps.PollsConfig',
]
运行下面的命令
python manage.py makemigrations polls
Migrations for 'polls':
polls/migrations/0001_initial.py:
- Create model Choice
- Create model Question
- Add field question to choice
通过运行makemigrations命令,Django 会检测你对模型文件的修改(在这种情况下,你已经取得了新的),并且把修改的部分储存为一次 迁移。
Django 有一个自动执行数据库迁移并同步管理你的数据库结构的命令 - 这个命令是 migrate
,我们马上就会接触它 - 但是首先,让我们看看迁移命令会执行哪些 SQL 语句。sqlmigrate
命令接收一个迁移的名称,然后返回对应的 SQL:
python manage.py sqlmigrate polls 0001
你将会看到类似下面这样的输出
BEGIN;
--
-- Create model Choice
--
CREATE TABLE "polls_choice" (
"id" serial NOT NULL PRIMARY KEY,
"choice_text" varchar(200) NOT NULL,
"votes" integer NOT NULL
);
--
-- Create model Question
--
CREATE TABLE "polls_question" (
"id" serial NOT NULL PRIMARY KEY,
"question_text" varchar(200) NOT NULL,
"pub_date" timestamp with time zone NOT NULL
);
--
-- Add field question to choice
--
ALTER TABLE "polls_choice" ADD COLUMN "question_id" integer NOT NULL;
ALTER TABLE "polls_choice" ALTER COLUMN "question_id" DROP DEFAULT;
CREATE INDEX "polls_choice_7aa0f6ee" ON "polls_choice" ("question_id");
ALTER TABLE "polls_choice"
ADD CONSTRAINT "polls_choice_question_id_246c99a640fbbd72_fk_polls_question_id"
FOREIGN KEY ("question_id")
REFERENCES "polls_question" ("id")
DEFERRABLE INITIALLY DEFERRED;
COMMIT;
我们再次运行以下命令,完成数据库迁移。
python manage.py migrate
当每次我们修改模型之后,我们需要重新生成迁移文件,然后将数据库迁移。
models.py
文件,改变模型。python manage.py makemigrations
为模型的改变生成迁移文件。python manage.py migrate
来应用数据库迁移。python manage.py createsuperuser
进入管理页面之后,用之前创建的admin账号进行登陆。
polls/admin.py
from django.contrib import admin
from .models import Question
from .models import Choice
# Register your models here.
admin.site.register(Question)
admin.site.register(Choice)
我们在管理页面中可以看到投票应用已经成功添加了。
在我们的投票应用中,我们需要下列几个视图:
polls/views.py
添加更多的视图
from django.http import HttpResponse
from django.shortcuts import render
from django.shortcuts import get_object_or_404
from polls.models import Question
# Create your views here.
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
context = {'latest_question_list': latest_question_list}
return render(request, 'polls/index.html', context)
def detail(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'polls/detail.html', {'question': question})
def results(request, question_id):
response = "You're looking at the results of question %s."
return HttpResponse(response % question_id)
def vote(request, question_id):
return HttpResponse("You're voting on question %s." % question_id)
polls/urls.py
将视图函数添加到polls/urls.py模块中
from django.urls import path
from . import views
# 为 URL 名称添加命名空间
app_name = 'polls'
urlpatterns = [
# ex: /polls/
path('', views.index, name='index'),
# ex: /polls/5/
path('/' , views.detail, name='detail'),
# ex: /polls/5/results/
path('/results/' , views.results, name='results'),
# ex: /polls/5/vote/
path('/vote/' , views.vote, name='vote'),
]
教程项目只有一个应用,polls
。在一个真实的 Django 项目中,可能会有五个,十个,二十个,甚至更多应用。Django 如何分辨重名的 URL 呢?举个例子,polls
应用有 detail
视图,可能另一个博客应用也有同名的视图。Django 如何知道 {% url %}
标签到底对应哪一个应用的 URL 呢?
除了上面的在polls/urls.py模块中,为URL名称添加命名空间。我们也可以在mysite/urls.py模块中为URL名称添加命名空间。
from django.contrib import admin
from django.urls import path
from django.urls import include
urlpatterns = [
path('admin/', admin.site.urls),
path('polls/', include(('polls.urls', 'polls'))),
]
在 polls
目录里创建一个 templates
目录。Django 将会在这个目录里查找模板文件。
polls/templates/polls/index.html
Title
{% if latest_question_list %}
{% for question in latest_question_list %}
- {{ question.question_text }}
{% endfor %}
{% else %}
No polls are available.
{% endif %}
polls/templates/polls/detail.html
{{ question.question_text }}
{% if error_message %}{{ error_message }}
{% endif %}
polls/templates/polls/detail.html**
{{ question.question_text }}
{% if error_message %}{{ error_message }}
{% endif %}