python3.7 Django库的使用

本文介绍了如何使用Python3.7的Django库搭建网页,详细解析了从创建项目和应用,到运行服务器的步骤。此外,还展示了结合数据库进行网页搭建的过程,包括向models.py添加模型,运行迁移命令,创建模板文件以及在views.py中处理数据交互。通过这些步骤,可以实现数据库的增查操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源代码链接 : 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.youkuaiyun.com/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 myhtml(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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值