安装:pip install django==2.1.0
验证安装是否成功,只要不提示不存在就证明安装成功:django-admin
web开发模式有一个MVC
django的开发模式是MTV
如何使用命令创建项目:
如何使用pycharm创建django项目
1、在pycharm里创建一个新项目
2、创建完成后即可启动项目,有两种方式
3、启动后访问http://127.0.0.1:8000,页面展示如下:
4、项目基本配置
import pymysql pymysql.install_as_MySQLdb()
5、目录介绍
STATICFILES_DIRS = ( os.path.join(BASE_DIR, ‘static‘), )
#用静态文件的配置。 #这里STATICFILES_DIRS是一个元祖,元祖里只有一个元素的时候要记得加,号
如何将写的东西展示到页面
如果写一个东西想在页面上访问有三个步骤
反过来请求某一个链接的时候首先是在urls.py里查找是否有匹配的url,匹配到以后看该url对应的函数是什么(url中指向某个函数需先import导入该函数),再在views.py里查找该函数对应的内容及映射的是哪个html,
django的模版语言在html里要想取一个list的下标用.取,例如**.0,引用的变量的时候还是{{}}
循环的是用{% for * in * %} {% endfor %}
如何建表
model是操作数据库的,所以我们需要在model.py下写表结构,使用的是Django自带的db.sqlite3数据库
(如果pycharm能识别这是一个django项目,那么我们可以使用tools->Run manage.py Task...启动,这样我们执行命令时就不需要加python manage.py了,例如生成表结构时直接在启动台里输入makemigrations即可)
例子:models.py
category表结构
id
name
create_time
update_time
from django.db import models # Create your models here. class Category(models.Model): #建一个类继承model name = models.CharField(verbose_name=‘分类名‘,max_length=50,unique=True) #CharField是字符串类型,必须指定最大长度,unique=True表示字段不能重复 create_time = models.DateTimeField(verbose_name=‘创建时间‘,auto_now_add=True) #auto_now_add=True表示创建的时候会自动记录当前的时间 update_time = models.DateTimeField(verbose_name=‘修改时间‘,auto_now=True) #auto_now=Tru表示修改的时候会自动给更新时间 is_delete=models.BooleanField(verbose_name=‘是否删除‘,default=False) class Meta: db_table = ‘category‘ # 定义表名,如果不定义表名默认生成的表名是“子项目名+定义的类名” ordering = [‘-create_time‘] #按什么排序,默认是升序,如果想要降序就加一个-号 verbose_name=‘文章分类‘ #加上这个后台管理页面表名显示为中文,设置verbose_name主要是为了在后台管理页面展示为中文,方便操作。 verbose_name_plural=verbose_name #英文是有复数的中文没有,加上这个中文后就不显示s了。如果就想显示英文,注释这两行即可。 def __str__(self): #这两句的目的是在后台管理工具中把添加的数据显示为数据库表里name的名字 return self.name
建表时如果表结构是带有上传图片的,有三步需要额外操作的
models.py
img=models.ImageField(verbose_name=‘文章图片‘,upload_to=‘article_img‘,default=‘images/1.jpg‘)
#使用ImageField需要安装pip install pillow才可以使用,upload_to指定将图片放到某个目录下,如果目录不存在会被自动创建。
#upload_to=‘article_img/%Y/%m‘ 这么写是说创建目录时带上年月避免混淆
settings.py
MEDIA_ROOT = os.path.join(BASE_DIR, ‘static‘) #上传文件的路径,这里指定在static文件夹下
第三步完成后我们即可在数据库中查看创建的表,复制db.sqlite3数据库的路径,打开连接数据库的工具Navicat,连接时类型选择‘现有数据库文件’,复制上数据库路径连接即可,如下图
使用pycharm自带的数据连接方法:
在pycharm里选择Database->点击+号->DateSource->选择我们的数据库sqlite,出现下图,在file里复制上数据库的链接地址即可连接成功,如果是首次连接页面下方会提示下载driver,下载后即可连接成功
表创建完成后,要想给表里增加数据,有2种方法:
要想使用django自带的后台管理工具,需做如下配置:
例子:我们前面创建里一个表category
from django.contrib import admin # Register your models here. from . import models #想在后台显示某个表,首先要导入models admin.site.register(models.Category) #配置这个后可以直接在页面操作数据库 admin.site.register(models.Article)
如何将创建的数据展示到页面中
例子: views.py from .models import Category def index(request): catagories=Category.objects.all() #all指查这个表里的所有数据,相当于这个sql语句select * from category print(catagories) #可以看到打印出来的实际是一个对象 return render(request, ‘index.html‘)
例子: index.html # django里循环用的是{% for ** %} {% endfor %} 取变量用{{}} # <ul id="starlist"> {% for n in nav %} <li><a href="index.html">{{ n.name }}</a></li> {% endfor %} </ul>
如何操作数据库的增删改查
import django,os os.environ.setdefault(‘DJANGO_SETTINGS_MODULE‘, ‘dj_test.settings‘) #指定django的配置文件在哪里,配置自己项目名下的settings django.setup() from user.models import Category,Article # 增加 # 方法一:create方式 # Category.objects.create(name=‘Mysql‘) #新增数据 # 同样也可以直接用 # c_obj=Category.objects.create(name=‘Mysql‘) # print(c_obj.name) # print(c_obj.create_time) # print(c_obj.update_time) # 方法二:实例化方式创建 # obj=Category(name=‘Oracle‘) # obj.save() # 查询 Category.objects.all() #查询所有的 print(Category.objects.get(id=1)) #只获取一条,get只能返回一条数据,多条会报错 print(Category.objects.get(name=‘Mysql‘)) #获取一条 Category.objects.filter(id__gt=1) #id大于1,filter是查询多条数据,返回一个list Category.objects.filter(id__lt=1) #id小于1 Category.objects.filter(id__gte=1) #id大于等于1 Category.objects.filter(id__lte=1) #id小于等于1 data=Category.objects.filter(id__gt=1,name="首页") #多个条件用,号隔开,是and关系 print(data.first()) #取第一条数据,也可以用下标方式取:data[0] print(data.last()) #取最后一条数据 Category.objects.filter(name__endswith=‘XX‘) #以什么结尾 Category.objects.filter(name__startswith=‘XX‘) #以什么开头 Category.objects.exclude(name="首页").filter(id__gte=1) #不等于 Category.objects.filter(name__startswith=‘李‘).exclude(sex="女")#还可以这样连用:先找到姓名是以李开头的在排除sex=女的。 print(Category.objects.filter(name__contains=‘L‘) )#包含 print(Category.objects.filter(name__icontains=‘l‘))#不区分大小写包含 print(Category.objects.filter(name__in=[‘首页‘,‘Mysql‘,‘python‘])) #or、!=、in、like select * from xxx like ‘%李%‘; #修改 # Category.objects.update(is_delete=True)#修改全表 # obj = Category.objects.get(id=1)#改某条数据 # obj.is_delete = False # obj.save() #实例化方式修改的数据,要save一下才可以成功 # Category.objects.filter(id__in=[2,3,4]).update(is_delete=False) #一次性修改多条数据 #删除 # Category.objects.all().delete()#删除全表 # # obj = Category.objects.get(id=1)#删某条数据 # obj.delete() # obj.save() # # Category.objects.filter(id__in=[2,3,4]).delete(is_delete=False) # 排序 Category.objects.all().order_by("-create_time") #按照create_time降序排列,如果有多个就,号分隔 # Category表和article表是一对多的关系 c_obj = Category.objects.get(id=1) # 1->多关系,1是Category表,如果想查某一个分类下的文章,首先查出这个分配 print(c_obj.article_set.count()) #article是多的那张表, print(c_obj.article_set.all()) #.all是取所有的文章 #多 article = Article.objects.get(id=1) #想知道某一个文章是在哪个分类下,需先获取到这个文章 print(article.category.name)
原文:https://www.cnblogs.com/tata-learning/p/12105308.html