# Django 项目
## 一、python django 安装
### 出现的问题
#### 问题
cmd 安装django中,通过 pip list 查看已装第三方库 出现WARNING: Ignoring invalid distribution -ip (d:\pyton\lib\site-packages)
#### 解决办法
## django 项目创建及运行
在项目文件夹下,cmd 命令窗口
输入 django-admin startproject [项目名称] ,点击创建好的项目文件,进入,在导航栏输入cmd, 进入命令窗口后输入python manage.py runserver 0.0.0.0:8000,然后到浏览器里面输入127.0.0.1:8000,进入django页面就是成功
#### 出现问题
1.如果通过进入manage.py文件,通过run 出现无法运行Couldn't import Django. Are you sure it's installed and available on ... 类似的报错。
2.运行成功但没有看到地址代码。
#### 解决办法
1.看一下configurations的configuration中的 python interpreter里面python版本问题。
2.configurations中paramenters:里面renserver是否填写;runserver命令会将服务器设置为监听本机内部ip的8000端口
## 二、 django 创建文档分析
#### 创建文件目录:
项目名称/
  manage.py
  项目名称/
   _init_.py
   settings.py
   urls.py
   asgin.py
   wsgi.py
#### 目录及文件用处是:
- 最外层的项目名称,根目录只是项目的容器,根目录名称对于Django没有影响,可以重命名为新名称。
- manage.py: 一个用各种方式管理Django项目的命令行工具。可以阅读 django-admin and manage.py 获取所有manage.py的细节。
- 项目名称/_init_.py:一个空文件,告诉python 这个目录应该被认为是一个python包。
- 项目名称/setting.py:Django项目的配置文件。
- 项目名称/urls.py:Django项目的URL声明,就像网站的“目录”。
- 项目名称/asgi.py:作为项目的运行在Asgi兼容的web服务器上的入口。
- 项目名称/wsgi.py:作为你的项目的运行在Wsgi兼容的web服务器上的入口。
## 三、通过django创建程序实例
### 程序实例1
#### django 创建投票应用
- 在处于manage.py所在的目录下,cmd 命令行行,输入py manage.py startapp 目录名称1
- 这样会创建一个目录,大致结构如下:
目录名称1/
  _init_.py
  admin.py
  apps.py
  migration/
   _init_.py
   models.py
   tests.py
   view.py
这个目录包含投票应用的全部内容
#### 编写第一个视图
打开项目名称1/views.py
输入如下代码:
```python
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello,world. You're at the 项目名称1 index")
```
这是Django中最简单的视图。要想看到效果,需要将一个URL映射到它 这就是我们需要URLconf的原因
为了创建 URLconf, 在项目名称1目录里面新建一个urls.py文件
在urls.py文件输入
```python
from django.urls import path
from . import views
urlpatterns = [
path('',views.index, name='index'),
]
```
下一步在根URLconf文件中指定我们创建的 项目名称1.urls 模块。 在 项目名称/urls.py 文件的urlpatterns 列表中插入一个 include(),如下:
```python
from django.contrib import admin
from django.urls import include path
urlpatterns = [
path('项目名称1/',include('项目名称1.urls')),
path('admin/', admin.site.urls),
]
```
通过命令检查是否正常工作
##### 项目工作问题
###### 问题1
- 问题 http://127.0.0.1:8000/ Page not found (404) 。
###### 解决办法
- 出现原因是访问网页出错,应该访问 http://localhost:8000/polls/ 。
#### django数据库配置
打开,项目名称/settings.py。这个包含了Django项目设置的python模块。
如果使用其他扩展性数据库,需要安装合适的 database bindings ,然后改变设置文件中 DATABASES 'default'项目中的一些键值:
- ENGINE - 可选值有
'django.db.backends.sqlite3' , 'django.db.backends.postgresql' , 'django.db.backends.MysqL' ,或'django.db.backends.oracle' 。其它 可用后端。
- NAME — The name of your database. If you’re using sqlite, the database will be a
file on your computer; in that case, NAME should be the full absolute path,
including filename, of that file. The default value, BASE_DIR / 'db.sqlite3' , will
store the file in your project directory.
如果不使用sqlite ,则必须添加一些额外设置,如:USER 、 PASSWORD 、HOST 等等。
编辑 mysite/settings.py 文件前,先设置 TIME_ZONE 为你自己时区。
此外,关注一下文件头部的 INSTALLED_APPS 设置项。这里包括了会在你项目中启用的所有 Django 应用。应用能
在多个项目中使用,你也可以打包并且发布应用,让别人使用它们。
通常, INSTALLED_APPS 默认包括了以下 Django 的自带应用:
编写你的第一个 Django 应用,第 2 部分
数据库配置
编写你的第一个 Django 应用,第 2 部分
本文档使用 书栈网 · BookStack.CN 构建 - 25 -
django.contrib.admin — 管理员站点, 你很快就会使用它。
django.contrib.auth — 认证授权系统。
django.contrib.contenttypes — 内容类型框架。
django.contrib.sessions — 会话框架。
django.contrib.messages — 消息框架。
django.contrib.staticfiles — 管理静态文件的框架。
这些应用被默认启用是为了给常规项目提供方便。
默认开启的某些应用至少需要一个数据表,所有在使用他们之前需要在数据库中创建一些表,
```cmd
py manage.py migrate
```
这个migrate 命令检查 INSTALLED_APPS设置,为其中的每个应用创建需要的数据表,至于具体会创建什么,取决于mysite/settings.py
#### 创建模型
Django 里面一个数据库驱动的web应用的第一步是定义模型-也就是数据库结构设计和附加的其他元数据。
模型是真实数据的简单明确的描述。包含了存储的数据的字段和行为。
```python
from django.db import models
class Question(models.Model):
question_test = models.CharField(max_length=200)
pub_date = models.DateField('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 每个字段要处理的数据类型。
#### 激活模型
前面创建模型的代码给Django很多信息,通过这些信息,Django可以
- 为这个应用创建数据库schema(生成 CREATE TABLE 语句)。
- 创建可以与Question 和 Choice 对象进行交互的Python数据库API。
但首先得把 polls 应用安装到项目中。
通过运行 makemigrations命令,Django会检测你对模型文件的修改并且把修改的部分存储为一次迁移。
迁移是 Django 对于模型定义(也就是你的数据库结构)的变化的储存形式 - 它们其实也只是一些你磁盘上的文
件。如果你想的话,你可以阅读一下你模型的迁移数据,它被储存在 polls/migrations/0001_initial.py 里
##### 出现问题
- No installed app with label 'polls'.报错
##### 解决方法
- 出现报错的原因是因为,主应用中的urls中未注册子应用,在 项目名称/settings.py中 INSTALLED_APPS 子项添加点式路径后,Django 项目会包含polls应用。再运行
```cmd
py manage.py makemigrations polls
```
Django 有一个自动执行数据库迁移并同步管理管理数据库结构的命令,这个命令是migrate,
sqlmigrate 命令接收一个迁移的名称名称,然后返回对应的sql:
```cmd
py manage.py sqlmigrate polls 0001
```
注意以下几点:
输出的内容和你使用的数据库有关,上面的输出示例使用的是 Postgresql。
数据库的表名是由应用名( polls )和模型名的小写形式( question 和 choice )连接而来。(如果需要,你
可以自定义此行为。)
默认的,Django 会在外键字段名后追加字符串 "_id" 。(同样,这也可以自定义。)
外键关系由 FOREIGN KEY 生成。你不用关心 DEFERRABLE 部分,它只是告诉 Postgresql,请在事务全都
执行完之后再创建外键关系。
生成的 sql 语句是为你所用的数据库定制的,所以那些和数据库有关的字段类型,比如 auto_increment
(MysqL)、 serial (Postgresql)和 integer primary key autoincrement (sqlite),Django 会帮你自
动处理。那些和引号相关的事情 - 例如,是使用单引号还是双引号 - 也一样会被自动处理。
这个 sqlmigrate 命令并没有真正在你的数据库中的执行迁移 - 相反,它只是把命令输出到屏幕上,让你看
看 Django 认为需要执行哪些 sql 语句。这在你想看看 Django 到底准备做什么,或者当你是数据库管理
员,需要写脚本来批量处理数据库时会很有用。
迁移是非常强大的功能,它能让你在开发过程中持续的改变数据库结构而不需要重新删除和创建表 - 它专注于使数据
库平滑升级而不会丢失数据。我们会在后面的教程中更加深入的学习这部分内容,现在,你只需要记住,改变模型需
要这三步:
编辑 models.py 文件,改变模型。
运行 python manage.py makemigrations 为模型的改变生成迁移文件。
运行 python manage.py migrate 来应用数据库迁移。
#### 初试API
现在让我们进入交互式python命令行,,尝试用Django创建的API ,下列命令行:
```cmd
py manange.py shell
```
database API
```shell
>>> from polls.models import Choice, Question # Import the model classes we just wrote.
# No questions are in the system yet.
>>> Question.objects.all()
<QuerySet []>
# Create a new Question.
# Support for time zones is enabled in the default settings file, so
# Django expects a datetime with tzinfo for pub_date. Use timezone.Now()
# instead of datetime.datetime.Now() and it will do the right thing.
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.Now())
# Save the object into the database. You have to call save() explicitly.
>>> q.save()
# Now it has an ID.
>>> q.id
1
# Access model field values via Python attributes.
>>> q.question_text
"What's new?"
>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)
# Change values by changing the attributes, then calling save().
>>> q.question_text = "What's up?"
>>> q.save()
# objects.all() displays all the questions in the database.
>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>
```
<Question: Question object (1)> 对于我们了解这个对象的细节没什么帮助。让我们通过编辑 Question
模型的代码(位于 polls/models.py 中)来修复这个问题。
代码文档 E:/学习文档(程序语言/Django%20v3.1%20官方文档.pdf
#### 介绍Django管理页面
```cmd
py manage.py createsuperuser
username:admin
Email address: admin@example.com
password:xiao12345678
password(again):xiao12345678
```
##### 启动开发服务器
```cmd
py manage.py runserver
```
然后打开浏览器,转到域名为“/admin/”目录,可以看到管理员登录界面。
输入前面注入的账号密码
可以看到几种可编辑的内容:组和用户。 它们是由django.contrib.auth 提供的。
##### 加入投票应用
一开始没有在索引里面显示
得告诉管理员,问题question对象需要一个后台接口。打开 项目名称1/admin.py
```python
from djang.contrib import admin
from .models import Question
admin.site.register(Question)
```