django 3.0

Django 3.0

本次关于django 3.0 的教程全部是基于 Windows 10 和 Python 3.8 的基础上。

建立虚拟环境

在CMD(命令提示符)中输入以下命令建立一个名为django的虚拟环境。

mkvirtualenv django

建立虚拟环境成功之后,会自动进入虚拟环境。

安装Django 3.0

直接安装django就会是最新的版本,这里我们需要的正是Django 3.0版本。

另外我们使用豆瓣源进行安装,以此来提高安装速度。

pip install django -i https://pypi.douban.com/simple/

django 3.0_第1张图片

创建项目

继续在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

django 3.0_第2张图片

如果看到以上界面之后,我们便可以在浏览器中访问http://127.0.0.1:8000/,如果访问成功,便代表项目建立成功。

django 3.0_第3张图片

创建投票应用

继续在CMD中输入以下命令来建立一个名为polls的应用。

python manage.py startapp polls

在PyCharm中打开项目

配置环境

django 3.0_第4张图片

编写第一个视图

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/

django 3.0_第5张图片

数据库配置

这里我们使用得数据库是MySQL 5.7及以上版本,Python版本是3.8。

首先我们需要安装一个用于连接Python和MySQL得工具包 mysqlclient

pip install mysqlclient

这样得安装方式是无法安装成功的。

mysqlclient 下载

在 https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient 中找到对应的版本,可以直接将包下载下来,再进行安装。
mysqlclient
django 3.0_第6张图片

mysqlclient 安装

pip install mysqlclient-1.4.6-cp38-cp38-win32.whl

django 3.0_第7张图片

建立数据库

在MySQL中建立名为在MySQL中mysite的数据库。

django 3.0_第8张图片

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

django 3.0_第9张图片

我们看到数据库中已经有了默认创建的表,代表数据库配置成功。

创建模型

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

django 3.0_第10张图片

当每次我们修改模型之后,我们需要重新生成迁移文件,然后将数据库迁移。

  • 编辑 models.py 文件,改变模型。
  • 运行 python manage.py makemigrations 为模型的改变生成迁移文件。
  • 运行 python manage.py migrate 来应用数据库迁移。

Django 管理页面

创建一个管理员账号

python manage.py createsuperuser

django 3.0_第11张图片

登陆管理页面

django 3.0_第12张图片

进入管理页面之后,用之前创建的admin账号进行登陆。

django 3.0_第13张图片

向管理页面中加入投票应用

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)

我们在管理页面中可以看到投票应用已经成功添加了。

django 3.0_第14张图片

添加更多的视图

在我们的投票应用中,我们需要下列几个视图:

  • 问题索引页——展示最近的几个投票问题。
  • 问题详情页——展示某个投票的问题和不带结果的选项列表。
  • 问题结果页——展示某个投票的结果。
  • 投票处理器——用于响应用户为某个问题的特定选项投票的操作。

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'),
]

为 URL 名称添加命名空间

教程项目只有一个应用,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 %}
    
{% else %}
    

No polls are available.

{% endif %}

polls/templates/polls/detail.html

{{ question.question_text }}

{% if error_message %}

{{ error_message }}

{% endif %}
{% csrf_token %} {% for choice in question.choice_set.all %}
{% endfor %}

polls/templates/polls/detail.html**

{{ question.question_text }}

{% if error_message %}

{{ error_message }}

{% endif %}
{% csrf_token %} {% for choice in question.choice_set.all %}
{% endfor %}

你可能感兴趣的:(#,django)