文章目录
- 一、环境
- 1.1 Django安装:
- 二、创建Django工程
- 2.1 创建命令django-admin startproject xuegod
- 2.2 运行命令python manage.py runserver
- 2.3 浏览器打开http://127.0.0.1:8000/
- 三、知识点
- 3.1 MVC MTV开发模式
- 3.2 个人理解:
- 3.3 views.py, 创建浏览器视图
- 3.4 urls网页请求
- 3.5 浏览器打开 127.0.0.1:8000/index
- 问题 出现的问题是: No module named 'views'
- 3.6 template文件夹 创建显示魔板
- 3.7 变量,标签,条件,循环
- 条件`{% if name %}{% else %}{% endif %}`
- 变量 `{{name}}`
- 循环`{% for index in test_list %}{{index }}{%endfor%}`
- 四、新建工程,创建模型层APP,与mysql通信
- 4.1 创建工程django-admin startproject mysql_project
- 4.2 测试
- a 创建文件夹template,修改settings.py`os.path.join(BASE_DIR, "template".replace("\\",'/'))`
- b 在 template文件夹中创建index.html
- c 创建mysql_project/views_test.py
- d 在mysql_project/urls.py中调用
- e 打开服务器,浏览器
- 4.3 创建APP User`python manage.py startapp User`
- 4.4 编辑User/models.py, `class User(models.Model)`
- 4.5 修改mysql_project/settings.py
- 4.6 数据库操作
- 4.7 同步数据库
- a 检测 数据库配置`python manage.py validate`
- b 同步数据 `python manage.py makemigrations`
- c 同步数据库表`python manage.py syncdb`
- 4.8 Django对数据库的增查
- a 命令行插入数据`python manage.py shell`
- b Django显示数据
- 修改User/views.py
- 创建template/user.html
- 修改ursl.py文件
- 浏览器显示
- 4.9 Django对数据库的删改
- a 命令行删除和修改数据`python manage.py shell
- 修改u.name = "FOR"; u.save()
- 删除u.delete()
一、环境
win10 python3.6 Django 1.8.2 sublime TXT
1.1 Django安装:
pip install django==1.8.2 -i https://pypi.mirrors.ustc.edu.cn/simple/
apt-get install python-mysqldb
# 上面出错的话执行下面命令
sudo apt-get install python-dev
二、创建Django工程
2.1 创建命令django-admin startproject xuegod
2.2 运行命令python manage.py runserver
2.3 浏览器打开http://127.0.0.1:8000/
三、知识点
3.1 MVC MTV开发模式
MVC模式
M模型 数据库,完成数据表的建立orm, 映射到数据库
V视图 放在服务器上用来处理用户请求的东西
C控制器 控制视图由谁显示
MTV 模式
模式 存在数据
T template 指定显示方式 前端
V views 指定显示数据
3.2 个人理解:
Django是Python框架, 用于创建前端后端的统一的框架, 客户端请求,服务器响应,
调出数据库后端, 返回数据, 前端浏览器进行显示
3.3 views.py, 创建浏览器视图
# 在包里面新建views.py,用于视图
#
# HTTP重要的两个元素
# request:请求(客户)
# response:响应(服务器)
# views.py
from django.http import HttpResponse
def index(request):
return HttpResponse("hello world")
pass
3.4 urls网页请求
from django.conf.urls import include, url
from django.contrib import admin
# from . import views
import views
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^index',views.index), # 这里应为新建的views.index包含的函数是返回hello world
]
3.5 浏览器打开 127.0.0.1:8000/index
问题 出现的问题是: No module named ‘views’
解决方案: 修改import views为from . import views
在运行127.0.0.1:8000/index成功显示为
3.6 template文件夹 创建显示魔板
说明: template文件放置html页面显示魔板
在settings.py里面修改配置添加template
os.path.join(BASE_DIR, "template".replace("\\",'/'))
表示根路径下链接template, 即D:\NodeAndCode\0_python3\Django\project_test\xuegod\template,在将\转换为/
# views.py
from django.http import HttpResponse
from django.template.loader import get_template # 加载魔板
from django.template import Context # 进行数据传输
from django.shortcuts import render_to_response # 进行数据传输
def index(request):
return HttpResponse("hello world")
pass
def birthday(request, day):
years = 2017-int(day)
return HttpResponse("you are %s"%years)
def happy(request):
template = get_template("index.html")
context = Context({"name":"jjjjj", "age":18,}) # 对返回的内容进行封装
return HttpResponse(template.render(context))
pass
def fun(request):
# return render_to_response("index.html",{"name":"fofo", "age":18,})
name = "fofo"
age = 18
return render_to_response("index.html", locals())
# locals将会把函数内的所有变量传到前端
pass
# urls.py
from django.conf.urls import include, url
from django.contrib import admin
from . import views
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^index/$', views.index), # 调用的使用127.0.0.1:8000/index
url(r'^birthday/(\d{4})/$', views.birthday), # 调用的使用127.0.0.1:8000/birthday/1990
url(r'^happy', views.happy),
url(r'^fun', views.fun)
]
# index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>index_test_zjq</title>
</head>
<body>
<p>注意是双大括号</p>
<p style="color:red; font-size:24px">
i am {{name}} a python ,hello world today is {{age}}
</p>
</body>
</html>
说明:
首先在浏览器输入127.0.0.1:8000/urls.py里面的那几个请求,
服务器就会根据请求从url(r'^网页字符匹配', 匹配函数地址)
去views.py寻找对应的函数执行, 而views.py内的函数调用并传递参数给html(template魔板), 以此来显示html魔板
3.7 变量,标签,条件,循环
条件{% if name %}{% else %}{% endif %}
变量 {{name}}
循环{% for index in test_list %}{{index }}{%endfor%}
看代码, 在重申一遍, urls.py调用views.py, views.py调用html文件显示前端
<!-- if_for.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>变量</title>
</head>
<body>
<P>hello</P>
<!-- if else endif -->
<P>
{% if name %}
<p>have name {{name}}</p>
{% else %}
<p>no name</p>
{% endif %}
</P>
<!-- ifequal endifequal-->
<p>
{% ifequal name "zjq" %}
<P>ifequal 如果等于 name "zjq"</P>
{% else %}
<p>else的操作name!=zjq {{name}}</p>
{% endifequal %}
</p>
<!-- for endfor -->
<p>
{% for index in test_list %}
<h1>{{index}} forloop就是每个元素的监控 {{forloop}} forloop.last {{forloop.last}}</h1>
{%endfor%}
</p>
<!-- for forloop endfor -->
<p>
<h1>hello</h1>
{% for index in c_list %}
{%if forloop.last%}
<h1 style="color: blue;">{{index}}</h1>
{% else %}
<h1 style="color: red;">{{index}}</h1>
{%endif%}
{% endfor %}
<h1>过滤器 {{name|upper}}</h1>
</p>
</body>
</html>
注意: `render_to_response("if_for.html",locals())`表示将当前函数内的所有参数都传递到if_for.html文件内
# views.py
# coding:utf-8
from django.http import HttpResponse
from django.template.loader import get_template # 加载魔板
from django.template import Context # 进行数据传输
from django.shortcuts import render_to_response # 进行数据传输
# if for测试
def if_for(request):
test_list = ["a", "b", "c"] # 列表索引测试
name = "mzjq"
c_list = range(3)
return render_to_response("if_for.html",locals())
# urls.py
from django.conf.urls import include, url
from django.contrib import admin
from . import views
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^if_for', views.if_for),
]
浏览器输入 127.0.0.1:8000/if_for
四、新建工程,创建模型层APP,与mysql通信
4.1 创建工程django-admin startproject mysql_project
4.2 测试
下面的所有代码的程序工程文件 mysql_project.rar
a 创建文件夹template,修改settings.pyos.path.join(BASE_DIR, "template".replace("\\",'/'))
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
os.path.join(BASE_DIR, "template".replace("\\",'/')), # 添加的template路径
],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
b 在 template文件夹中创建index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>index_test_zjq</title>
</head>
<body>
<p>注意是双大括号</p>
<p style="color:red; font-size:24px">
i am {{name}} a python ,hello world today is {{age}}
</p>
<p>字典参数显示:{{content}}, 或者{{content.name}}, 还可以调用字符串的内部方法{{content.name.upper}}</p>
<p>类的参数显示: {{pc}}, 独立参数{{pc.hp}} 独立方法{{pc.fight}} 然后结果是{{pc.hp}} </p>
<p>列表索引格式test_list.1 = {{test_list.1}}</p>
</body>
</html>
c 创建mysql_project/views_test.py
from django.shortcuts import render_to_response # 进行数据传输
class Hero:
def __init__(self):
self.hp = 100
self.mp = 100
def fight(self):
self.hp -= 10
def index(request):
name = "fun2"
content = {"name":"hello", "age":18} # 字典测试
pc = Hero() #类实例化参数测试
test_list = ["a", "b", "c"] # 列表索引测试
return render_to_response("index.html", locals())
d 在mysql_project/urls.py中调用
# urls.py
from django.conf.urls import include, url
from django.contrib import admin
from . import views_test
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^index/$', views_test.index), # 调用的使用127.0.0.1:8000/index
]
e 打开服务器,浏览器
4.3 创建APP Userpython manage.py startapp User
此时文件夹应该包含如下
4.4 编辑User/models.py, class User(models.Model)
from django.db import models
# Create your views here.
class User(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
email = models.EmailField(max_length=32)
# 注意两点
# 映射层字段默认都是不为空
# 默认有主键id
4.5 修改mysql_project/settings.py
以下模块内数据需要修改
# 修改1
DATABASES = {
'default': {
# 默认数据库
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# zjq 配置mysql
'ENGINE': 'django.db.backends.mysql',
'NAME': 'Django', # 注意这个数据库通过root用户需要新建
'HOST':'localhost',
'USER':'root',
'PASSWORD':'zjq',
'PORT':3306, # 默认不用加
}
}
# 修改2
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'User', # zjq添加 刚刚创建app的名字
)
4.6 数据库操作
登陆数据库
PS C:\Users\Admin_Q> mysql -u root -p
Enter password: ***
#创建数据库
mysql> create databases Django;
Query OK, 1 row affected (0.01 sec)
4.7 同步数据库
a 检测 数据库配置python manage.py validate
$ python manage.py validate
D:\ProgramFiles\python3.6.8\lib\site-packages\django\core\management\commands\validate.py:15: RemovedInDjango19Warning: "validate" has been deprecated in favor of "check".
RemovedInDjango19Warning)
System check identified no issues (0 silenced).
b 同步数据 python manage.py makemigrations
$ python manage.py makemigrations
Migrations for 'User':
0001_initial.py:
- Create model User
此时 User/migrations/0001_initial.py的内容
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
]
operations = [
migrations.CreateModel(
name='User',
fields=[
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
('name', models.CharField(max_length=32)),
('age', models.IntegerField()),
('email', models.EmailField(max_length=32)),
],
),
]
- 遇到的问题:
No changes detected in app 'User
说明:如果严格按照上面的操作是不会有次问题的
我出错的原因是因为,将class User()
定义到了User/views.py中了,其实应该定义到User/models.py
中
另外看网上出现此问题的另外很多原因总结如下:
- 在class User()定义时没有继承类Models,应该注意
class User(models.Model):
- 当出现No changes detected时,尝试网上一种方案: python manage.py makemigrations --empty APPname,但是这个虽然运行没有问题,也生成了0001_initial.py,但是此py非彼py,所以此方案有待考究
- 在settings.py中忘记注册User,也就是
INSTALLED_APPS = ('User',)
- 综上所述, 除了马虎大意,其他高端题似乎还没有.
c 同步数据库表python manage.py syncdb
$ python manage.py syncdb
D:\ProgramFiles\python3.6.8\lib\site-packages\django\core\management\commands\syncdb.py:24: RemovedInDjango19Warning: The syncdb command will be removed in Django 1.9
warnings.warn("The syncdb command will be removed in Django 1.9", RemovedInDjango19Warning)
Operations to perform:
Synchronize unmigrated apps: staticfiles, messages
Apply all migrations: contenttypes, User, auth, admin, sessions
Synchronizing apps without migrations:
Creating tables...
Running deferred SQL...
Installing custom SQL...
Running migrations:
Rendering model states... DONE
Applying User.0001_initial... OK
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying sessions.0001_initial... OK
You have installed Django's auth system, and don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use 'admin_q'): admin
Email address: xxx@qq.com
Password:
Password (again):
Superuser created successfully.
此时数据库表已经更新成为我们刚刚在class里面定义的三个参数
mysql> use Django;
Database changed
mysql> show tables;
+----------------------------+
| Tables_in_django |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
| user_user |
+----------------------------+
11 rows in set (0.00 sec)
mysql> desc user_user;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(32) | NO | | NULL | |
| age | int(11) | NO | | NULL | |
| email | varchar(32) | NO | | NULL | |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)
4.8 Django对数据库的增查
| mysql | Django |
增 | inset | instace.objects.create |
删 | drop | delete |
改 | update/alter | update |
查 | select | instace.objects.all |
instace.objects.filter | ||
instace.objects.get | ||
instace.objects.order_by | ||
instace.objects.create |
from User.models import User # 导入User表
a 命令行插入数据python manage.py shell
命令行操作
Admin_Q@DESKTOP-AKFGQ25 MINGW64 /d/NodeAndCode/0_python3/Django/mysql_project
$ python manage.py shell
Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.8.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: print("hello")
hello
In [2]: from User.models import User
In [3]: u = User(name="for", age = 21, email= "for@qq.com")
In [4]: u.save()
In [5]: User.objects.create(name="while",age=22.email="while@qq.com")
File "<ipython-input-5-a39842fb466e>", line 1
User.objects.create(name="while",age=22.email="while@qq.com")
^
SyntaxError: invalid syntax
In [6]: User.objects.create(name="while", age = 21, email= "while@qq.com")
Out[6]: <User: User object>
In [7]: User.objects.create(name="make", age = 43, email= "make@qq.com")
Out[7]: <User: User object>
In [8]: User.objects.create(name="jk", age = 29, email= "jk@qq.com")
Out[8]: <User: User object>
In [9]: User.objects.create(name="okp", age = 14, email= "okp@qq.com")
Out[9]: <User: User object>
数据库中数据显示
mysql> select * from user_user;
+----+-------+-----+--------------+
| id | name | age | email |
+----+-------+-----+--------------+
| 1 | for | 21 | for@qq.com |
| 2 | while | 21 | while@qq.com |
+----+-------+-----+--------------+
2 rows in set (0.00 sec)
b Django显示数据
修改User/views.py
from django.shortcuts import render_to_response
from .models import User
# Create your views here.
def user(request):
name = "user_zjq"
age = 32
all_user_data = User.objects.all() # select * from user_user
filter_user = User.objects.filter(name="while") #筛选 select * from user_user where name="while"
# 记住.get这个不能乱用,不然会出错
# get_user = User.objects.get(id=1) # get条件必须唯一, 通常为主键
order_user = User.objects.order_by("age") # 排序输出, 按照年龄进行排序输出
order_user_front2 = User.objects.order_by("age")[:2] # 排序输出取前两个
fo_user = User.objects.filter(age=21).order_by("name") # 首先取出age=21的,然后在按照name排序
return render_to_response("user.html", locals())
- 问题: 无法显示, 使用VCcode总是显示
Class 'User' has no 'objects' memberpylint(no-member)
- 于是对于User导入包的方式各种尝试
-
from User.models import User
-
from .models import User
-
sys.path.append(r"../User/") from User.models import User
- 以上都有问题,于是我就不管错误, 直接在网页操作, 发现网页按照预期进行显示(上面两种导入方式)
- 建议使用第二种导入方式, .models表示导入当前包中的文件
models.py
创建template/user.html
<!DOCTYPE html>
<html>
<head>
<title>user</title>
<meta charset="utf-8">
</head>
<body>
<h1>this is user page this name is {{name}}, {{age}} years old</h1>
<h1>select * from user_user</h1>
<ul>
{% for i in all_user_data %}
<li>
{{i.name}} {{i.age}} {{i.email}}
</li>
{% endfor %}
</ul>
<h1>select * from user_user where name="while"</h1>
<u1>
{% for i in filter_user %}
<li>
{{i.name}} {{i.age}} {{i.email}}
</li>
{% endfor %}
</u1>
<h1>s按照age排序从大到小排序</h1>
<u1>
{% for i in order_user %}
<li>
{{i.name}} {{i.age}} {{i.email}}
</li>
{% endfor %}
</u1>
<h1>select * from user_user where id=1, 但是get不是列表格式,而是一条数据</h1>
<u1>
<l1>{{get_user.name}},{{get_user.age}},{{get_user.email}}</l1>
</u1>
</body>
</html>
修改ursl.py文件
# urls.py
from django.conf.urls import include, url
from django.contrib import admin
from . import views_test
from User.views import *
urlpatterns = [
url(r'^admin/$', include(admin.site.urls)),
url(r'^index/$', views_test.index), # 调用的使用127.0.0.1:8000/index
url(r"^user/$", user)
]
浏览器显示
4.9 Django对数据库的删改
a 命令行删除和修改数据`python manage.py shell
修改u.name = “FOR”; u.save()
删除u.delete()
Admin_Q@DESKTOP-AKFGQ25 MINGW64 /d/NodeAndCode/0_python3/Django/mysql_project
$ python manage.py shell
Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.8.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: print("hello")
hello
In [2]: from User.models import User
In [3]: u = User(name="for", age = 21, email= "for@qq.com")
In [4]: u.save()
In [5]: User.objects.create(name="while",age=22.email="while@qq.com")
File "<ipython-input-5-a39842fb466e>", line 1
User.objects.create(name="while",age=22.email="while@qq.com")
^
SyntaxError: invalid syntax
In [6]: User.objects.create(name="while", age = 21, email= "while@qq.com")
Out[6]: <User: User object>
In [7]: User.objects.create(name="make", age = 43, email= "make@qq.com")
Out[7]: <User: User object>
In [8]: User.objects.create(name="jk", age = 29, email= "jk@qq.com")
Out[8]: <User: User object>
In [9]: User.objects.create(name="okp", age = 14, email= "okp@qq.com")
Out[9]: <User: User object>
# 修改id=1的name数据为大写
In [10]: u = User.objects.get(id=1)
In [11]: u.name
Out[11]: 'for'
In [12]: u.name = "FOR"
In [13]: u.save()
In [14]: u.name
Out[14]: 'FOR'
# 删除id=1的数据
In [15]: u = User.objects.get(id=1)
In [16]: u.delete()
修改name
mysql> select * from user_user;
+----+-------+-----+--------------+
| id | name | age | email |
+----+-------+-----+--------------+
| 1 | FOR | 21 | for@qq.com |
| 2 | while | 21 | while@qq.com |
| 3 | make | 43 | make@qq.com |
| 4 | jk | 29 | jk@qq.com |
| 5 | okp | 14 | okp@qq.com |
+----+-------+-----+--------------+
5 rows in set (0.00 sec)
删除id=1
mysql> select * from user_user;
+----+-------+-----+--------------+
| id | name | age | email |
+----+-------+-----+--------------+
| 2 | while | 21 | while@qq.com |
| 3 | make | 43 | make@qq.com |
| 4 | jk | 29 | jk@qq.com |
| 5 | okp | 14 | okp@qq.com |
+----+-------+-----+--------------+
4 rows in set (0.00 sec)