Django
- 安装
pip install django
新建工程
- 命令行模式下
django-admin startproject django1
- pycharm中,命令同上
- 完成后自动创建的工程文件
创建应用
进入工程目录
C:\Python_Project\Django>cd django1
创建apps
C:\Python_Project\Django\django1>python manage.py startapp app1
启动服务
C:\Python_Project\Django\django1>python manage.py runserver
创建服务器子功能
- 打开app1下的views.py文件
from django.http import HttpResponse
def welcome(request):
return HttpResponse('欢迎来到澡堂!')
添加路径
- 打开django1文件夹下的urls.py文件
"""
引入包含功能的文件
"""
from app1 import views
urlpatterns = [
path('admin/', admin.site.urls),
"""
添加路径和功能名,注意name必需唯一,未来可以用来替代路径名'welcome'
"""
path('welcome/', views.welcome, name='wc')
]
在设置文件中添加自己的应用
- 打开django1下面的setting.py文件
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
"""
添加自己的应用
"""
'app1',
]
打开浏览器测试
- 地址栏输入:
http://127.0.0.1:8000/welcome
创建网页
- 在app1中创建templates文件夹
单网页配置
在templates中新建login.html文件
- 注意文件夹的名字必须是templates,django默认会自动绑定
<body>
<form action="">
<div>
用户名: <input type="text" name="username">
</div>
<div>
<span style="letter-spacing: 1em">密</span>码: <input type="password" name="password">
</div>
<input type="submit" value="登录">
</form>
</body>
在views.py中添加功能函数
# 定义函数完成指定页面的渲染
def show_login(request):
return render(request, 'login.html')
在urls中添加功能路径
path('login/', views.show_login, name='login')
打开浏览器测试
http://127.0.0.1:8000/login
数据传递
GET方式
在views.py文件中添加功能函数
def receive_data(request):
user = request.GET.get('username')
password = request.GET.get('password')
return HttpResponse('您本次登录使用的用户名为{0},密码为{1}'.format(user, password))
在urls.py文件中添加路径
path('login/check', views.receive_data, name='login_check')
在login.html文件中给表单添加操作地址
<form action="http://127.0.0.1:8000/login/check">
POST方式
修改login.html文件中给表单添加method
<form action="http://127.0.0.1:8000/login/check" method="post">
修改views.py文件中的GET为POST
user = request.POST.get('username')
password = request.POST.get('password')
打开浏览器输入信息,点击登录
出现CSRF提示,解决方案有两种
- 在表单<form>下加入
{% csrf_token %}
- 在表单<form>下加入
可以解决当前问题,但不推荐,存在安全隐患
- 在views.py中做如下修改:
引入模块
from django.views.decorators.csrf import csrf_exempt
在添加函数receive_data
前加装饰器
应用合并
移动路由
1.将django中的urls.py文件复制到app1中,做修改后文件如下
from django.urls import path
from app1 import views
urlpatterns = [
path('welcome/<str:username>/<str:password>/', views.welcome, name='wc'),
path('login/', views.show_login, name='login'),
path('login/check', views.receive_data, name='login_check')
]
2.修改django1中的urls.py文件
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('app1/', include('app1.urls'))
]
3.修改form表单中的action
<form action="http://127.0.0.1:8000/app1/login/check" method="post">
避免归并重名
在app1下的templates下新建app1文件夹
- 将login.HTML移动到此文件夹中
修改views.py文件中的渲染
def show_login(request):
return render(request, 'app1/login.html')
所有需要避免重名项
1.同一工程目录下的不同应用的文件名
2.静态文件static(见本文静态文件)中的文件名
- 不同应用下的static文件最后会归档到根目录下的static文件夹
3.模板文件templates中的文件名
- 不同应用下的templates文件最后会归档到根目录下的templates文件夹
4.各个应用下的路由urls文件中的path()中的参数三name
- 原则上参数一也不能重名
避免重名解决
1.工程目录结构如下:
- 在二级文件目录static,templates下新建跟应用名相同的文件夹,之后再将文件放入其中
2.在urls.py文件中将参数一和参数三都加上应用名
- 最好的方法是跟共同开发人员协商好,各自对应一个前缀编码,命名时加上各自的编码前缀
3.将页面访问的地址改为url的形式(前提是path()中的name不能同名)
<form action="{%url 'app1_show'%}" method="post">
页面传值
页面间传值
页面内传值
在templates中新建show.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>展示</title>
</head>
<body>
<div class="pers">
{% for per in persons%}
<form action="">
<div class="per">
<h3>姓名: {{per.name}}</h3>
<p>
性别:
<!--注意==左右需要加空格,否则解析不出来-->
{% if per.sex == '男' %}
<input type="radio" name="sex" value="男" checked>男
<input type="radio" name="sex" value="女">女
{% else %}
<input type="radio" name="sex" value="男" >男
<input type="radio" name="sex" value="女" checked>女
{% endif %}
</p>
<p>年龄: {{per.age}}</p>
</div>
</form>
{% endfor %}
</div>
</body>
</html>
在app1下的views.py中加入
def show(request):
pers = [
{'name': '冰冰', 'sex': '女', 'age': 20},
{'name': '冰冰1', 'sex': '男', 'age': 22},
{'name': '冰冰2', 'sex': '女', 'age': 24},
{'name': '冰冰3', 'sex': '中', 'age': 25},
{'name': '冰冰4', 'sex': '女', 'age': 26},
{'name': '冰冰5', 'sex': '女', 'age': 27},
{'name': '冰冰6', 'sex': '女', 'age': 28}
]
return render(request, 'app1/show.html', {"persons": pers})
静态文件
配置文件setting.py,在文件尾部添加
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
- BASE_DIR为工程目录Django/django1/...;定义可见于文件头部
在app1中新建static(工程部署时django会自动合并所有的static文件)
在html文件头部加入
{% load static %}
数据库
创建模型
在models.py文件中创建表格信息
from django.db import models
class Accounts(models.Model):
username = models.CharField(primary_key=True, max_length=20)
password = models.CharField(max_length=20)
admin.py
from django.contrib import admin
# 导入所有使用from .models import *
from .models import Accounts
# 该文件是管理员文件,用来完成数据库数据模型的注册保证服务器端数据库和数据模型实现数据同步
admin.site.site_header = 'App1'
admin.site.site_title = 'app1'
# 将account数据模型注册进入数据库
admin.site.register(Accounts)
数据库表格迁移
迁移初始化
python manage.py makemigrations
开始迁移:
python manage.py migrate
创建超级管理员
python manage.py creatsuperuser
输入相应信息
使用管理员信息登录
127.0.0.1:8000/admin
修改表格信息
修改user的数据类型
password = models.CharField(max_length=20)
更新修改
C:\Python_Project\Django\database>python manage.py makemigrations
C:\Python_Project\Django\database>python manage.py migrate
issue
- 1.新建应用时出现如下错误提示
File "manage.py", line 14
)from exc
^
SyntaxError: invalid syntax
问题原因:python2与python3共存问题
- 如果安装时使用的是
pip3 install django
修改python3安装路径下的python.exe为python3.exe,
之后先修改pycharm中的settings,选中刚刚修改的文件,
再使用python3 manage.py startapp app1
即可创建应用。
- 2.
python3 manage.py runserver
提示:
Traceback (most recent call last):
File "C:\Users\LZTV\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\management\base.py", line 316, in run_from_argv
self.execute(*args, **cmd_options)
- 3.数据库迁移时出现应用标签不唯一,多个admin,
注意查看自己建立的应用是否有名字为admin的,切记不可设为admin