0
点赞
收藏
分享

微信扫一扫

django基础

泠之屋 2022-11-25 阅读 146


文章目录

  • ​​一、环境​​
  • ​​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:响应(服务器)

django基础_html

# 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’

django基础_html_02


解决方案: ​​修改import views为from . import views​​ 在运行127.0.0.1:8000/index成功显示为

django基础_html_03

3.6 template文件夹 创建显示魔板

django基础_python_04


说明: template文件放置html页面显示魔板

在settings.py里面修改配置添加template

django基础_python_05


​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):
# print
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

django基础_django_06

四、新建工程,创建模型层APP,与mysql通信

4.1 创建工程django-admin startproject mysql_project

django基础_html_07

4.2 测试

​​下面的所有代码的程序工程文件 mysql_project.rar​​

a 创建文件夹template,修改settings.py​​os.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 打开服务器,浏览器

django基础_django_08

4.3 创建APP User​​python manage.py startapp User​

django基础_python_09


此时文件夹应该包含如下

django基础_python_10

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

浏览器显示

django基础_html_11

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)


举报

相关推荐

0 条评论