您的位置:首页 > 编程语言 > Python开发

python3.7 Django库的使用

2019-05-14 13:09 183 查看

源代码链接 : https://github.com/yfc-tourist/Python 找到new文件

  1. python Django 网页搭建
    (1).函数解析

    """path()函数
    path() 具有四个参数,两个必须参数:route 和 view,
    两个可选参数:kwargs 和 name。即路由和视图是必填参数。
    
    route 是一个匹配URL的准则(类似正则表达式)。
    当Django响应一个请求时,它会从urlpatterns的第一项开始,按顺序依次匹配列表中的项,直到找到匹配的项。
    
    为你的URL取名能使你在 Django 的任意地方唯一地引用它,尤其是在模板中。
    这个有用的特性允许你只改一个文件就能全局地修改某个URL模式。
    
    注意:
    
    要从URL捕获值,请使用尖括号。
    捕获的值可以选择包括转换器类型。例如,用于 <int:name>捕获整数参数。如果未包含转换器/,则匹配除字符之外的任何字符串。
    没有必要添加前导斜杠,因为每个URL都有。例如,它articles不是/articles。
    默认情况下,以下路径转换器可用:
    
    str- 匹配除路径分隔符之外的任何非空字符串'/'。如果转换器未包含在表达式中,则这是默认值。
    int - 匹配零或任何正整数。返回一个int。
    slug - 匹配由ASCII字母或数字组成的任何slug字符串,以及连字符和下划线字符。例如, building-your-1st-django-site。
    uuid - 匹配格式化的UUID。要防止多个URL映射到同一页面,必须包含短划线并且字母必须为小写。例如,075194d3-6885-417e-a8a8-6c931e272f00。返回一个 UUID实例。
    path- 匹配任何非空字符串,包括路径分隔符 '/'。这使您可以匹配完整的URL路径,而不仅仅是URL路径的一部分str。
    比如要匹配一个视图中的函数路由,该函数有两个形参:
    def peopleList(request,book_id)
    path('<int:book_id>/',views.peopleList,name='peopleList')
    
    """
    
    """re_path()
    如果遇上路径和转换器语法都不足以定义的URL模式,
    那么就需要使用正则表达式,这时候就需要使用re_path(),而非path()。
    re_path(r'^(\d+)/$',views.peopleList,name='peopleList')
    """
    ![该工程的结构,•	myproject1: 项目的容器目录

(2)网站搭建
• student web项目目录结构
](https://img-blog.csdnimg.cn/20190514132445101.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lmY2phdmE=,size_16,color_FFFFFF,t_70)

使用的命令(DOS)
django-admin startproject myproject1
django-admin startapp student

#urls.py
"""myproject URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/2.2/topics/http/urls/
Examples:
Function views
1. Add an import:  from my_app import views
2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
1. Add an import:  from other_app.views import Home
2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path,re_path#需增加
from student import views#需增加

urlpatterns = [
path('admin/', admin.site.urls),
#path('www.baidu/<int:yfc_>',views.home),
re_path("[a-z]/0$",views.home),#正则匹配成功,调用views.home
#path('www.baidu/',views.home),#www.baidu/匹配成功,调用views.home
]
#views.py
from django.shortcuts import render
from django.http import HttpResponse#增加

# Create your views here.
def home(request):
#print(n)
return(HttpResponse('<h2>Blog Home</h2>'))
#print("\n yes yfc \n")

(3).运行
python manage.py runserver 0.0.0.0:8000 (DOS窗口运行)
在浏览器中输入 127.0.0.1:8000/a/0

————————
用另一种方法搭建网站 (以上面的项目为基础,向其中增加代码)
(1)创建student/Templates/login.html,向其中加入如下代码

<html>
<head>
<meta charset="utf-8" />
<title>user login</title>
</head>
<body>
<form action="/dologin/" method="post">
{% csrf_token %}
<p>username:<input type="text" name="username"></p>
<p>password:<input type="password" name="passwd"></p>
<p><input type="submit" value="login"></p>
</form>
<p>{{username}}</p>
<p>{{password}}</p>
</body>
</html>

(2)在urls.py增加

urlpatterns = [
re_path("www",views.login)
]

(3)在views.py增加

from django.template.context_processors import csrf
def login(request):
ctx={}
return render(request, "login.html",ctx)

(4)在settings.py中 ,找到TEMPLATES向里面加入

'DIRS': [os.path.join(BASE_DIR,"student/Templates")],#html文件所在路径

(5)运行
python manage.py runserver 0.0.0.0:8000 (DOS窗口运行)
在浏览器中输入 127.0.0.1:8000/www

2.Django+数据库搭建
(1)向models.py增加

#models常用的Field,这些Field的参数见(https://blog.csdn.net/weixin_37773766/article/details/80330221)
class Userinfo(models.Model):
userid = models.AutoField(primary_key=True) #设置主键
username = models.CharField(max_length=20) #字符串字段,必须设置max_length参数
password = models.CharField(max_length=20)
createCounttime=models.DateTimeField(auto_now_add=True) #帐号申请时间

class Studentinfor(models.Model):
stuid = models.ForeignKey('Userinfo',to_field='userid',on_delete='CASCADE')
name=models.CharField(max_length=20)
age=models.IntegerField(max_length=3) #整形
gendle=models.BooleanField()  # 布尔类型
classes=models.CharField(max_length=50)
subject=models.CharField(max_length=50)
result=models.FloatField() #浮点类型

(2)在settings.py中 ,找到INSTALLED_APPS向里面加入

'student', # web项目名

DOS 下运行 python manage.py makemigrations

出现 No changes detected,可能(2)设置错误、没有删除student\migrations\*_initial.py、(1)下没增加代码

(3) DOS 下运行 python manage.py migrate

如果无法迁移成功,则是项目文件下的*.sqlit3没删除

(4)在settings.py中 ,找到TEMPLATES向里面加入

'DIRS': [os.path.join(BASE_DIR,"student/Templates")],#html文件所在路径

(5)创建student/Templates/userinfo.html,向其中加入如下代码(调用具体的html文件,这是第三个需运行的文件)

它显示的是一个登陆界面,与views.py下的myhtml和add_data函数有关。
首先调用myhtml函数显示该网页,若点击按钮则调用add_data函数执行相关操做
<html>
<head>
<meta charset="utf-8" />
<title>add_user_info</title>
</head>
<body>
<p align="center">
<form action="/add_data/" method="post"> #此句与views.py的处理函数对应
{% csrf_token %}
<p>username:<input type="text" name="username"></p>
<p>password:<input type="password" name="passwd"></p>
<p><input type="submit" value="adduser"></p>
</form>
</p>
{{ added }}
</body>
</html>

创建student/Templates/showall.html,向其中加入如下代码

Html:(数据显示文件-showall.html)
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>datalist</title>
</head>
<body>
<table style="color: green" border="2">
<td>id</td>
<td>username</td>
<td>createtime</td>
{% for m in datas %}
<tr>
<td>{{ m.userid }}</td>
<td>{{ m.username }}</td>
<td>{{ m.createCounttime }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>

(6)在视图文件views.py中输入处理代码(url匹配成功,这是第二个运行的文件)

from django.shortcuts import render
from django.http import HttpResponse,HttpResponseRedirect
from django.template.context import RequestContext
#包装csrf请求,避免django认为其实跨站攻击脚本
from django.views.decorators.csrf import csrf_exempt
from django.template.context_processors import csrf
from .models import Studentinfor
from .models import Userinfo

def myhtm
3ff7
l(request):
ctx={}
return render(request, "userinfo.html",ctx)
#request: 用于生成响应的请求对象
#template_name: 要使用的模板的完整名称
#context:context: 添加到模板上下文的一个字典. 默认是一个空字典.
#如果字典中的某个值是可调用的, 视图将在渲染模板之前调用它.

def add_data(request): #对数据库进行增加操作,并返回操做结果
username=request.POST['username']
pin = request.POST['passwd']
userinfo = Userinfo()
userinfo.username=username
userinfo.password=pin
userinfo.save()
ctx={}
ctx.update(csrf(request))
ctx['added']='添加数据成功!'
return render(request, "userinfo.html",ctx)

def query(request):   #对数据库进行查加操作,并返回操做结果
b=Userinfo.objects.all()
return render(request,'showall.html',{'datas':b})
#此方法的作用---结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。

(7) 在project1目录下urls.py添加路径信息。(输入127开头的url后,这是第一个运行的文件)

from django.urls import re_path
from student import views
urlpatterns = [
re_path(r'^myhtml/$', views.myhtml,name='myhtml'),
re_path(r'^add_data/$', views.add_data,name='adddata'),
re_path(r'^query/$', views.query,name='queryall'),
]

通过网站,实现了数据库的增加与查询

django 数据库操作(在views.py中)

UserInfo是models.py下的一个类
from .models import Userinfo

查
UserInfo.objects.all() #查出库中所有的数据
UserInfo.objects.all().values('user')    #只取user列
UserInfo.objects.all().values_list('id','user')    #取出id和user列,并生成一个列表
UserInfo.objects.get(id=1) #查询字段是1的的这条数据,如果是多条和没有的时候会报错,尽量结合try-except使用
a=UserInfo.objects.filter(id=1) #同上get()方法,但get()方法返回的不是iterator
对返回的iterator进行判断是否有值
a.exists()、a.count()//返回值的个数、a

增
UserInfo.objects.create(user='yangmv',pwd='123456')
或者
obj = UserInfo(user='yangmv',pwd='123456')
obj.save()
或者
dic = {'user':'yangmv','pwd':'123456'}
UserInfo.objects.create(**dic)

改

UserInfo.objects.filter(user='yangmv').update(pwd='520') #先找到,然后才能改(update可更新多条)
或者
obj = UserInfo.objects.get(user='yangmv') #查询到一条你要更新数据
obj.pwd = '520' #更新
obj.save()

删
UserInfo.objects.filter(user='yangmv').delete() #删除多条数据(过滤出user字段等于'yangmv'的都删除)
UserInfo.objects.all().delete() #删除表中全部数据
UserInfo.objects.get(aa="tte").delete() #删除一条aa等于‘tte’的数据

——————————————————————————
以下是对上面代码的完善

//查数据
views.py:
def search(request):
ctx = {}
return render(request, "search.html", ctx)

def find(request):
userid=request.POST['userid']
ctx={}
ctx.update(csrf(request))
try:
a=Userinfo.objects.filter(userid=userid)
except :
ctx['result'] = '输入有误!'
else:
if not a.exists():
ctx['result'] = '数据不存在!'
else:
ctx['result'] = '数据存在!'
#a=model_to_dict(a)
ctx['datas']=a
print(a)
#return render(request, 'showall.html', {'datas': a})
return render(request, "search.html",ctx)

urls.py:
re_path("search/",views.search),
re_path("find/",views.find),

Templates/search.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>search</title>
</head>
<body>
<p align="center">
<form action="/find/" method="post">
{% csrf_token %}
<p>userid:<input type="text" name="userid"></p>
<p><input type="submit" value="search"></p>
</form>
</p>

<table style="color: green" border="2">
<td>userid</td>
<td>username</td>
<td>password</td>
<td>createtime</td>
{% for m in datas %}
<tr>
<td>{{ m.userid }}</td>
<td>{{ m.username }}</td>
<td>{{ m.password }}</td>
<td>{{ m.createCounttime }}</td>
</tr>
{% endfor %}
</table>
{{ result }}
</body>
</html>

//删数据
views.py:
def delete(request):
ctx = {}
return render(request, "delete.html", ctx)

def delete_result(request):
username = request.POST['username']
passwd=request.POST['passwd']
ctx = {}
ctx.update(csrf(request))
try:
a = Userinfo.objects.filter(username=username,password=passwd)
except:
ctx['result'] = '输入有误!'
else:
if not a.exists():
ctx['result'] = '数据不存在!'
else:
a.delete()
ctx['result'] = '数据删除!'
print(a)
return render(request, "delete.html", ctx)

urls.py:
re_path("delete/",views.delete),
re_path("delete_result/",views.delete_result),

Templates/delete.html:
<html>
<head>
<meta charset="utf-8" />
<title>del_user_info</title>
</head>
<body>
<p align="center">
<form action="/delete_result/" method="post">
{% csrf_token %}
<p>username:<input type="text" name="username"></p>
<p>password:<input type="password" name="passwd"></p>
<p><input type="submit" value="delete"></p>
</form>
</p>
{{ result }}
</body>
</html>

//改数据
views.py:
def update(request):
ctx = {}
return render(request, "update.html", ctx)

def update_result(request):
username=request.POST['username']
password = request.POST['passwd']
update_password = request.POST['update_passwd']
ctx = {}
ctx.update(csrf(request))
try:
a = Userinfo.objects.filter(username=username,password=password)
except:
ctx['result'] = '输入有误!'
else:
if not a.exists():
ctx['result'] = '数据不存在!'
else:
a.update(password=update_password)
ctx['result'] = '数据已变更!'
print(a)
return render(request, "delete.html", ctx)

urls.py:
re_path("update/",views.update),
re_path("update_result/",views.update_result),

Templates/update.html:
<html>
<head>
<meta charset="utf-8" />
<title>add_user_info</title>
</head>
<body>
<p align="center">
<form action="/update_result/" method="post">
{% csrf_token %}
<p>username:<input type="text" name="username"></p>
<p>password:<input type="password" name="passwd">
update_password:<input type="password" name="update_passwd"></p>
<p><input type="submit" value="save"></p>
</form>
</p>
{{ result }}
</body>
</html>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: