django 3.0_这个人懒得名字都没写的博客-程序员秘密_django3.0

技术标签: # django  python  django  

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/

在这里插入图片描述

创建项目

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

在PyCharm中打开项目

配置环境

在这里插入图片描述

编写第一个视图

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

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

mysqlclient 下载

mysqlclient的安装对于windows来说比较复杂。

Windows:

在 https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient 中找到对应的版本,可以直接将包下载下来,再进行安装。
mysqlclient
在这里插入图片描述

mysqlclient 安装

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

在这里插入图片描述

macOS

安装MySQL和mysqlclient

# 确保是Python3环境
$ brew install mysql
$ pip install mysqlclient

如果不想装MySQL,而是只要mysqlclient

$ brew install mysql-client
$ echo 'export PATH="/usr/local/opt/mysql-client/bin:$PATH"' >> ~/.bash_profile
$ export PATH="/usr/local/opt/mysql-client/bin:$PATH"
$ pip install mysqlclient
Debian / Ubuntu:
$ sudo apt-get install python3-dev default-libmysqlclient-dev build-essential
$ pip install mysqlclient
Red Hat / CentOS
% sudo yum install python3-devel mysql-devel
$ pip install mysqlclient

建立数据库

在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

在这里插入图片描述

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

Django 管理页面

创建一个管理员账号

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('<int:question_id>/', views.detail, name='detail'),
    # ex: /polls/5/results/
    path('<int:question_id>/results/', views.results, name='results'),
    # ex: /polls/5/vote/
    path('<int:question_id>/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

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
        <li><a href="{% url 'polls:detail' question.id %}">{
   { question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}
</body>
</html>

polls/templates/polls/detail.html

<h1>{
   { question.question_text }}</h1>

{% if error_message %}<p><strong>{
   { error_message }}</strong></p>{% endif %}

<form action="{% url 'polls:vote' question.id %}" method="post">
{% csrf_token %}
{% for choice in question.choice_set.all %}
    <input type="radio" name="choice" id="choice{
   { forloop.counter }}" value="{
   { choice.id }}">
    <label for="choice{
   { forloop.counter }}">{
   { choice.choice_text }}</label><br>
{% endfor %}
<input type="submit" value="Vote">
</form>

polls/templates/polls/detail.html**

<h1>{
   { question.question_text }}</h1>

{% if error_message %}<p><strong>{
   { error_message }}</strong></p>{% endif %}

<form action="{% url 'polls:vote' question.id %}" method="post">
{% csrf_token %}
{% for choice in question.choice_set.all %}
    <input type="radio" name="choice" id="choice{
   { forloop.counter }}" value="{
   { choice.id }}">
    <label for="choice{
   { forloop.counter }}">{
   { choice.choice_text }}</label><br>
{% endfor %}
<input type="submit" value="Vote">
</form>
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42856871/article/details/105040684

智能推荐

ISP芯片_狮子座硅农(Leo ICer)的博客-程序员秘密_isp芯片

图像信号处理芯片(Image Signal Processor,简称ISP)。一款SoC能支持几颗摄像头,支持最高多少像素的传感器、可以录制多少分辨率和帧数(如8K/30FPS)的视频、支持拍摄多少FPS的慢动作、是否支持HDR视频,以及拍照成像的计算,都离不开ISP的支持。换句话说,ISP规格越强,就支持更先进的摄像头,在搭配相同摄像头时具备更好的成像底蕴。NPU:NPU 聪明靠它 2017年底,华为推出的麒麟970第一次引入了NPU(神经网络处理器)概念,让SoC也具备了更强...

Linux设备驱动中的阻塞和非阻塞IO_shenyeaxu的博客-程序员秘密

这篇文章我们来了解下Linux设备驱动中阻塞和非阻塞。阻塞:阻塞是指执行设备操作时,如果不能获得设备资源,则挂起进程,是进程进入休眠模式,直到设备资源可以获取。非阻塞:非阻塞是在不能获取设备资源时,要么放弃获取,要么一直不停的查询,直到可以获取资源。这两种操作能够为为应用程序提供这样的能力:(1)当应用程序对设备资源进行read(), write()操作时,如果设备资源不能获取,用...

Azure DevOps Server 的连接源(Artifacts):八、npm发布和安装包_Azure DevOps的博客-程序员秘密

1. 概述本文主要介绍如何基于Azure DevOps Server的Artifacts连接源,实现nodejs依赖包的下载、发布管理;使用Azure DevOps Server的Artifacts模块作为企业内网的npm私服。2. 前期准备2.1 更改连接源方法一:安装了node后,系统默认的连接源是npmjs.org ,需要我们手动将本地计算机的连接源设置为DevOps Server中的一个...

asp.net ajax程序设计之笔记4--使用DragOverlayExtender拖动元素,结合ProfileService将位置信息保存至数据库_youchenlong的博客-程序员秘密

ProfileService.aspx     TagPrefix="asp" %>                                    AutoSave="true">                                 TargetControlID="Login1" ProfileProperty="loginPosition" ProfileServi

mysql解压版(mysql-5.7.23-winx64.zip)的安装_魔芋小灰菜的博客-程序员秘密_mysql下载解压版安装

mysql解压版(mysql-5.7.23-winx64.zip)的安装mysql-5.7.23-winx64.zip下载链接:https://dev.mysql.com/downloads/file/?id=478884(末尾给出官网下载方式)1:下载后解压到安装的位置:D:\mysql-5.7.23-winx642:配置path以及my.ini文件MySQL安装文件分...

Day36-40/关系型数据库MySQL_Python-Jack的博客-程序员秘密

关系数据库入门关系数据库概述1.数据持久化 - 将数据保存到(在掉电情况下)能够长久保存数据的存储介质中。2.数据库发展史 - 网状数据库、层次数据库、关系数据库、NoSQL数据库。1970年,IBM的研究员E.F.Codd在Communication of the ACM上发表了名为A Relational Model of Data for Large Shared Data Bank...

随便推点

使用script setup语法糖优化你的vue3代码_ooooonly_real的博客-程序员秘密

script setup是vue3中新引入的语法糖,目的是简化使用Composition API时冗长的模板代码。

EK-LM3S8962之LED_weixin_30412013的博客-程序员秘密

1、新建工程 2、添加头文件 拷贝自C:\StellarisWare\inc 3、添加startup_gcc.c 拷贝自C:\StellarisWare\boards\ek-lm3s8962\hello\startup_gcc.c 4、添加main.c 1 #include "../Include/lm3s8962.h" 2 #include "../Include/hw_gpio.h" 3 ...

sapui5 访问OData数据_杨江的博客-程序员秘密

开发环境:eclipse Luna, sapui5 toolkit eclipse plugin(从sap官网下载) 运行环境:eclipse + Tomcat OData环境:SAP在公网上提供的免费的基于NetWeaver Gateway的测试用OData服务代码说明: 最开始测试 sServiceUrl = “http://sapes1.sapdevcenter.com:8080/

软件包大赏11期|全球首款同时兼容I2C/SPI板级数字通讯接口的测力传感器软件包..._RT-Thread物联网操作系统的博客-程序员秘密

hi~小伙伴们,好久不见!不知不觉软件包栏目已经连载了10期,通过「软件包大赏」栏目大家也认识了不少来自社区的牛人,热爱探索的学生马龙伟/郭永超、总是创意满满的留洋博士阿嘉、风趣幽默的...

【项目经验】MySQL中的only_full_group_by模式详解_九离⠂的博客-程序员秘密_mysql only_full_group_by

MySQL中的only_full_group_by模式一、背景ERROR 1055 (42000): Expression #7 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘postscan.verifyDelayLog.auditor’ which is not functionally dependent on columns in GROUP BY clause; this is inco

LeetCode-349.两个数组的交集_Lin769440473的博客-程序员秘密

/** 349.两个数组的交集* @author 作者 Your-Name:* @version 创建时间:2020年2月17日 下午3:02:49* 给定两个数组,编写一个函数来计算它们的交集。示例 1:输入: nums1 = [1,2,2,1], nums2 = [2,2]输出: [2]示例 2:输入: nums1 = [4,9,5], nums2 = [9,4,...

推荐文章

热门文章

相关标签