Django 基础操作
django是一个重量级的python服务端开发框架,我们可以用它来开发一些后端服务和网站,这篇博客学习一下django的基本操作
一、安装 Django
pip install django
二、创建、启动项目
1 django-admin startproject dj_test #创建一个django项目 2 cd dj_test #进入项目目录 3 python manange.py runserver #运行
⚠️ django-admin命令在django安装完成之后就有了,如果django安装成功了没有django-admin命令,请检查python安装目录下的scripts目录是否加入环境变量。
运行完成在浏览器里面访问 127.0.0.1:8000就可以看到项目正常运行,如下图

三、创建应用
创建完项目之后,在项目里创建一个应用,也就是各个模块,比如说一个商城系统,有订单模块、用户模块、商品模块等等。也可以只有一个模块。
python manage.py startapp user #创建一个user模版
项目和应用创建完成之后,再创建2个目录,templates和static,templates放html文件,static放静态文件,js和css文件,目录结构是这样的,如下图: 
四、Django 常用配置修改
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'user' #加入自己写的模块
]
#INSTALLED_APPS,这个是管里面有哪些子模块,user是咱们自己创建的模块,如果需要使用,就要加入到里面
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates')], #模板目录
'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',
],
},
},
]
#TEMPLATES是配置模板的地方,要修改的是DIRS这个,修改成自己的templates目录
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', #数据库引擎改为mysql
'NAME': 'db_name',#数据库名称
'USER': 'db_user',#用户
'PASSWORD': 'db_password',#密码
'HOST': '127.0.0.1',#ip
'PORT': '3306',#端口号
}
}
#DATABASES 是数据库的配置,这里默认使用的是sqlite数据库,如果要改成mysql的话,修改成上面写的
#注意,使用mysql数据库的话,需要注意以下2点
#1、数据库使用mysql的话,需要安装pymysql模块
#2、在项目同名的文件夹的__init__.py文件里面加入
# import pymysql
# pymysql.install_as_MySQLdb()
LANGUAGE_CODE = 'zh-Hans'
#LANGUAGE_CODE是语言,默认是英文的,这里改成中文
TIME_ZONE = 'Asia/Shanghai'
#TIME_ZONE是时区,默认是标准时区的,这里改完中国的时区
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
) #静态文件的目录
#STATICFILES_DIRS是静态文件的目录,放一些css、js,static文件夹需要自己创建
五、数据库
如果用 mysql 数据库的话,要在__init__文件里面加入下面的代码。这是因为 Django 装 mysql 模块比较麻烦。
import pymysql pymysql.install_as_MySQLdb()
models.py - 定义表结构的地方。
同步到数据库(表结构更改时才需要同步)的操作:
python manage.py makemigrations #生成迁移文件,后面可以跟一个参数,表示指定更新哪个模块的代码 python manage.py migrate #同步到数据库中
建表的内容:
1 class Nav(models.Model): 2 name = models.CharField(max_length=10,unique=False,verbose_name='导航名称') #字段名,字符串格式 3 is_delete = models.SmallIntegerField(default=1,verbose_name='是否被删除') 4 create_time = models.DateTimeField(verbose_name='创建时间',auto_now_add=True) #自动把创建时间设置为当前时间 5 update_time = models.DateTimeField(auto_now=True,verbose_name='更新时间') #自动更新为当前时间 6 7 def __str__(self): 8 return self.name 9 10 class Meta: 11 verbose_name = '导航表' #显示在后台的表名 12 verbose_name_plural = verbose_name 13 db_table = 'nav' 14 # ordering = ['create_time'] #默认根据哪个字段排序
实用的枚举方法:(第4、5行)
1 class Student(models.Model): 2 name = models.CharField(max_length=10) #int类型不需要最大长度 3 #枚举举例 4 sex_choice = ((0,'男'),(1,'女')) 5 sex = models.SmallIntegerField(choices=sex_choice,verbose_name='性别') 6 content = models.TextField() #存长文本的 7 img = models.ImageField(upload_to='touxiang') 8 file = models.FileField(upload_to='wenjian') 9 create_time = models.DateTimeField(auto_new_add=True)#创建时间 10 update_time = models.DateTimeField(auto_now)#更新为现在的时间 11 12 def __str__(self): 13 return self.name 14 15 class Meta: 16 db_table = 'student' #指定表名,默认app名+类名 17 ordering = ['-id'] #默认按什么排序 18 verbose_name_plural = '学生表' 19 verbose_name = '学生表'
对表的增删该查:
1 # 数据库的增删改查 2 os.environ.setdefault('DJANGO_SETTINGS_MODULE','dj_test.settings') #设置Django的配置文件 3 django.setup() #连接数据库 4 5 6 from user import models 7 from django.db.models import Q 8 9 #新增 10 for i in range(5): 11 models.Nav.objects.create(name='我的日记%d'%i) 12 13 # 实例化的方式新增 14 nav_obj = models.Nav(name='我的心情') 15 nav_obj.save() 16 17 #查询 18 result = models.Nav.objects.get(name='我的日记') #get 需要保证查出来的数据只有一条 19 result2= models.Nav.objects.filter(is_delete=1) 20 21 print(result) 22 print(result2) 23 24 # 模糊查询 25 result2= models.Nav.objects.filter( name__contains='我的') 26 result2= models.Nav.objects.filter(id__gt = 0) #大于0 27 result3= models.Nav.objects.filter(id__gte = 1) #大于等于1 28 result4= models.Nav.objects.filter(id__lt = 2) #小于2 29 result5= models.Nav.objects.filter(id__lte = 2) #小于等于2 30 result6 = models.Nav.objects.filter(id_range=[1,5]) #范围 31 result7 = models.Nav.objects.filter(id__in=[1,2,3,5]) #在这几个数中 32 result8 = models.Nav.objects.exclude(name='我的心情') #排除 33 print(result8) 34 35 # 或 36 result9 = models.Nav.objects.filter(Q(id__in=[1,2,3])|Q(name__contains='4')) 37 print(result9) 38 39 # 获取表里所有数据 40 all = models.Nav.objects.all() 41 42 # 修改 43 n = models.Nav.objects.get(name__contains='%') 44 n2 = models.Nav.objects.filter(pk=1) #primay key 45 n.name='我的手帐' 46 n.is_delete = 0 47 n.save() 48 49 # 筛选后删除 50 models.Nav.objects.filter(is_delete=1).update(is_delete=0) 51 models.Nav.objects.filter(is_delete=0).update(is_delete=1) 52 53 # 删除 54 models.Nav.objects.all().delete() #删除所有 55 models.Nav.objects.filter(id__lt=2).delete()
以上,models 是建表文件,Nav 是表名。
六、学习中的杂记
1. 页面定义(和逻辑)写在 view,index 作为入口的主界面,url 和 view 之间的关联在于 urls 中配了指定的路径访问指定的页面。
多个页面中有同样的部分时(比如类似于页眉页脚的存在),可以抽成公共的部分,保存为 base.html 文件
其中:
#body:
{% block content %}
{% endblock %}
#head:
{% block css %}
{% endblock %}
{% block js %}
{% endblock %}
继承时写: {% extends 'base.html' %}
2. 上下文处理器
这部分是关于公共数据的处理,比如有的数据用到好几次,没必要每次都重写。我的项目中位于:dj_test.content_process.py
1 from user import models 2 3 def nav_title_process(request): 4 # navs = ['python', '前端', 'django', '啦啦啦'] 5 # title = 'xiaohei的个人博客' 6 navs = models.Nav.objects.filter(is_delete=1) # query_set 7 title = '小黑的博客' 8 content = {'daohang':navs,'title':title} 9 return content
关于前端页面使用时的调用(第6-8行):
1 <header class="header-navigation" id="header"> 2 <nav> 3 <div class="logo"><a href="/">{{title}}</a></div> 4 <h2 id="mnavh"><span class="navicon"></span></h2> 5 <ul id="starlist"> 6 {% for nav in daohang %} 7 <li><a href="/nav/{{nav.id }}">{{nav.name}}</a></li> 8 {% endfor %} 9 10 </ul> 11 </nav> 12 </header>
这个的配置要加在 setting-TEMPLATES 中
3. views 的具体用法
1 from django.shortcuts import render,HttpResponse 2 3 # Create your views here. 4 5 #专门写逻辑的 6 7 def index(request): #格式要求写request 8 9 article = [ 10 {'title':'第一篇文章','content':'123ksjdfkahf'}, 11 {'title':'The Second','content':'1232423'} 12 ] 13 dic = {'articles':article} 14 return render(request,'index.html',dic) 15 # render 用于返回html时,返回的dic位置的东西可以直接在html中用
views 中写的方法,在定义 URL 的时候添加了调用,因此方法定义中的数据,可以在对应的页面中引用。使用 render 返回 html,就是为了解析那些对变量的引用,引用方法是“{{name}}”。
学完一周有的地方记不住了,所以记录不是很完善,之后再做补充。
。
o
O
End

浙公网安备 33010602011771号