windows7
python 3.7
idea
安装django
pip install django
创建HelloWorld
在D:/HelloWorld 执行
django-admin startproject HelloWorld
会在当前目录下生产HelloWorld项目
使用idea打开
在idea的Terminal 中执行(在CMD中执行卡在了Watching for file changes with StatReloader)
python manage.py runserver
访问 http://127.0.0.1:8000/
设置下admin的账号密码
输入账号和密码
在HelloWorld的view.py中增加代码
from django.http import HttpResponse
def hello(request):
return HttpResponse('Hello World! django')
在helloWorld中的urls中配置下
from django.contrib import admin
from django.urls import path
from . import view
from django.conf.urls import url
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^hello$', view.hello),
]
url() 函数
Django url() 可以接收四个参数,分别是两个必选参数:regex、view 和两个可选参数:kwargs、name,接下来详细介绍这四个参数。
- regex: 正则表达式,与之匹配的 URL 会执行对应的第二个参数 view。
- view: 用于执行与正则表达式匹配的 URL 请求。
- kwargs: 视图使用的字典类型的参数。
- name: 用来反向获取 URL。
访问 http://127.0.0.1:8000/hello
在manage.py同级目录下新建templates目录,新建hello.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
hello {{helloMap}}
</body>
</html>
修改settings.py 中的TEMPLATES
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, "templates")],
'''
}
在helloworld的view.py中增加
from django.shortcuts import render
def helloMap(request):
context = {}
context['helloMap'] = 'myHello Map'
return render(request, 'hello.html', context)
配置下urls.py
from django.contrib import admin
from django.urls import path
from HelloWorld.view import hello, helloMap
from django.conf.urls import url
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^hello$', hello),
url('helloMap/', helloMap),
]
访问http://127.0.0.1:8000/helloMap/
新建app
先安装下mysql
pip install mysqlclient
新建一个app
django-admin startapp AppTest
会生成一个AppTest项目
在settings.py中加入
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'AppTest',
]
在settings中新增数据库连接信息
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test',
'USER': 'root',
'PASSWORD': 'mysql',
'HOST': 'localhost',
'PORT': '3306'
}
}
在AppTest的models.py中增加代码
from django.db import models
# Create your models here.
class Person(models.Model):
name = models.CharField('名称', max_length=100)
age = models.IntegerField('年龄')
address = models.CharField('地址', max_length=300)
id =models.IntegerField('编号', primary_key=True)
def __unicode__(self):
return self.id
执行
python manage.py migrate
python manage.py makemigrations AppTest
python manage.py migrate AppTest
注意: 可能报错
django.db.migrations.exceptions.MigrationSchemaMissing: Unable to create the django_migrations table ((1064, "You have an error in your SQL
syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(6) NOT NULL)' at line 1"))
原因是mysql的版本过低, 请至少升级mysql的版本至5.6
全部执行完成之后,可以看到数据库中的表
在AppTest的admin.py中增加配置
from django.contrib import admin
from AppTest.models import Person
admin.site.register(Person)
可以直接操作Person的数据库
操作一下网页版本
appTest的models新增user
class User(models.Model):
user = models.CharField('账号', max_length=16)
pwd = models.CharField('密码', max_length=32)
id = models.AutoField('编号', primary_key=True)
在views里面新增
def add(request):
from AppTest import models
# 1
# u = models.User(user='shj')
# u.save()
# 2
# models.User.objects.create(user='sss',pwd='123456')
dic = {'user':'wkk','pwd':'wkk'}
models.User.objects.create(**dic)
return HttpResponse('增加成功')
查询
def select(request):
from AppTest import models
user_list = models.User.objects.all()
return render(request, 'user.html', {'user_list': user_list})
templates/user.html
<!--
~ Copyright (C) 2020 Baidu, Inc. All Rights Reserved.
-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table border="1">
<thead>
<tr>
<td>账号</td>
<td>密码</td>
</tr>
</thead>
<tbody>
{% for user in user_list%}
<tr>
<td>{{user.user}}</td>
<td>{{user.pwd}}</td>
</tr>
{% endfor%}
</tbody>
</table>
</body>
</html>
配置urls
from django.contrib import admin
from django.urls import path
from HelloWorld.view import hello, index, helloMap
from AppTest.views import add, select
from django.conf.urls import url
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^hello$', hello),
url('helloMap/', helloMap),
url('index/', index),
url('appTest/add/', add),
url('appTest/select/', select),
]
在网页中增加数据并显示
修改views.py,增加代码
from django.views.decorators.csrf import csrf_protect
def home(request):
return render(request, 'user.html')
@csrf_protect
def addHtml(request):
from AppTest import models
if request.method == 'POST':
user = request.POST['user']
pwd = request.POST['pwd']
models.User.objects.create(user=user,pwd=pwd)
user_list = models.User.objects.all()
return render(request, 'user.html', {"user_list": user_list})
修改urls.pu
urlpatterns = [
'''
url('appTest/home/', home),
url('appTest/addHtml/', addHtml),
]
修改user.tml
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/appTest/addHtml/" method="post">
{% csrf_token %}
账号: <input type = 'text' name="user" /><br />
密码: <input type = 'password' name="pwd" /><br />
<input type = 'submit' value="增加" />
</form>
<table border="1">
<thead>
<tr>
<td>账号</td>
<td>密码</td>
</tr>
</thead>
<tbody>
{% for user in user_list%}
<tr>
<td>{{user.user}}</td>
<td>{{user.pwd}}</td>
</tr>
{% endfor%}
</tbody>
</table>
</body>
</html>
注意: 1 form的action 路径结尾需要加上 '/', 否则可能报错
Exception Type: RuntimeError
Exception Value:
You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining POST data. Change your form to point to 127.0.0.1:8000/appTest/addHtml/ (note the trailing slash), or set APPEND_SLASH=False in your Django settings.
2 如果不加入csrf,则会报错
在浏览器中访问http://127.0.0.1:8000/appTest/home/
增加一条数据
一个完整的网页操作数据库 功能
models.py
from django.db import models
class User(models.Model):
user = models.CharField('账号', max_length=16)
pwd = models.CharField('密码', max_length=32)
id = models.AutoField('编号', primary_key=True)
views.py
from django.shortcuts import render
from django.http import HttpResponse
from django.template.context import RequestContext
from django.views.decorators.csrf import csrf_protect
def home(request):
return render(request, 'user.html')
def add(request):
from AppTest import models
# 1
# u = models.User(user='shj')
# u.save()
# 2
# models.User.objects.create(user='sss',pwd='123456')
dic = {'user':'wkk','pwd':'wkk'}
models.User.objects.create(**dic)
return HttpResponse('增加成功')
@csrf_protect
def addHtml(request):
from AppTest import models
if request.method == 'POST':
user = request.POST['user']
pwd = request.POST['pwd']
models.User.objects.create(user=user,pwd=pwd)
user_list = models.User.objects.all()
return render(request, 'user.html', {"user_list": user_list})
# 1
# u = models.User(user='shj')
# u.save()
# 2
# models.User.objects.create(user='sss',pwd='123456')
dic = {'user':'wkk','pwd':'wkk'}
models.User.objects.create(**dic)
return HttpResponse('增加成功')
def updateHtml(request):
from AppTest import models
if request.method == 'POST':
id = request.POST['id']
user = request.POST['user']
pwd = request.POST['pwd']
models.User.objects.filter(id=id).update(user=user, pwd=pwd)
user_list = models.User.objects.all()
return render(request, 'user.html', {"user_list": user_list})
def select(request):
from AppTest import models
user_list = models.User.objects.all()
return render(request, 'user.html', {'user_list': user_list})
def deleteHtml(request):
from AppTest import models
if request.method == 'GET':
id = request.GET['id']
models.User.objects.filter(id=id).delete()
user_list = models.User.objects.all()
return render(request, 'user.html', {"user_list": user_list})
urls.py
from django.contrib import admin
from django.urls import path
from HelloWorld.view import hello, index, helloMap
from AppTest.views import add, select, addHtml, home, deleteHtml, updateHtml
from django.conf.urls import url
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^hello$', hello),
url('helloMap/', helloMap),
url('index/', index),
url('appTest/home/', home),
url('appTest/add/', add),
url('appTest/addHtml/', addHtml),
url('appTest/deleteHtml/', deleteHtml),
url('appTest/updateHtml/', updateHtml),
url('appTest/select/', select),
]
一个完整的增删改查页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/appTest/addHtml/" method="post">
{% csrf_token %}
账号: <input type = 'text' name="user" /><br />
密码: <input type = 'password' name="pwd" /><br />
<input type = 'submit' value="增加" />
</form>
<table border="1" style={margin-top: 20px}>
<thead>
<tr>
<td>编号</td>
<td>账号</td>
<td>密码</td>
<td>操作</td>
</tr>
</thead>
<tbody>
{% for user in user_list%}
<tr>
<td>{{user.id}}</td>
<td>{{user.user}}</td>
<td>{{user.pwd}}</td>
<td>
<a href="/appTest/deleteHtml/?id={{user.id}}" >删除</a>
<form action="/appTest/updateHtml/" method="post">
{% csrf_token %}
<input type = 'hidden' value={{user.id}} name="id" /><br />
账号: <input type = 'text' name="user" /><br />
密码: <input type = 'password' name="pwd" /><br />
<input type = 'submit' value="修改" />
</form>
</td>
</tr>
{% endfor%}
</tbody>
</table>
</body>
</html>