初识Django-前后端不分离(一)

Django 是一个web开发框架也是一个服务端开发框架

安装:pip install django==2.1.0

验证安装是否成功,只要不提示不存在就证明安装成功:django-admin

web开发模式有一个MVC

  • M就是model---操作数据库的
  • V就是view----操作视图
  • C就是controller----控制逻辑

django的开发模式是MTV

  • M就是model---操作数据库的
  • T就是template----操作视图
  • V就是view----控制逻辑

如何使用命令创建项目:

  1. 创建一个名字为test的项目 :django-admin startproject test  
  2. 创建完成后cd test进入会有一个manage.py文件是用来启动项目的,运行即可启动项目
  3. 在test项目里创建子项目user :python manager.py startapp user
  4. 启动test项目:python manage.py runserver(启动后默认端口号是8000,如想更改端口号:python manage.py runserver 0:81111)

创建好django项目后,如果pycharm能识别这是一个django项目,那么我们可以使用tools->Run manage.py Task...启动,这样我们执行命令时就不需要加python manage.py了,例如创建子项目直接startapp user即可。

如何使用pycharm创建django项目

1、在pycharm里创建一个新项目

2、创建完成后即可启动项目,有两种方式

    • 第一种通过命令:python manage.py runserver启动,需进入到项目目录下才可以启动
    • pycharm识别出这是一个django项目,点击右侧启动按钮即可启动项目,后面的小虫子是debug模式运行

3、启动后访问http://127.0.0.1:8000,页面展示如下:

4、项目基本配置

    • settings.py里是项目的基本配置,连接数据库,redis都是在这里配置。
      • 文件77行DATABASES里就是配置数据库的,默认使用的是sqlite数据库,如果以后想要改数据库的话,在这里修改。
      • 如果以后想用mysql数据库的话,除了在DATABASES这里配置mysql数据库外,还需在与settings.py文件同级的__init__.py里增加以下代码才可用。
        import pymysql
        pymysql.install_as_MySQLdb()
      • 文件里的TEMPLATES下的DIRS里是配置templates文件夹下html模版的路径,如果你将html文件放在别的文件夹下,需在这里配置html模版的路径。
      • 我们可以看到访问的页面都是英文的,要想显示中文,改LANGUAGE_CODE = 'zh-Hans', TIME_ZONE是时区,我们改成亚洲的时间TIME_ZONE = 'Asia/Shanghai'  否则以后存储到数据里的时间会不对,USE_TZ = False 表示使用当前设置的时区修改完成后再次访问页面,即显示中文。
      • 总结:创建一个diango项目后setting需修改3处位置 LANGUAGE_CODE = 'zh-Hans' , TIME_ZONE = 'Asia/Shanghai' , USE_TZ = False 。

 5、目录介绍

    • templates里是放html文件
    • 新建一个static文件夹,用来放静态文件,以后在html中引用时需在settings.py里配置一下
      STATICFILES_DIRS = (
          os.path.join(BASE_DIR, 'static'),
      ) 
      #用静态文件的配置。 #这里STATICFILES_DIRS是一个元祖,元祖里只有一个元素的时候要记得加,号
    • 创建的子项目user文件夹下有一个views.py,这里是专门写逻辑的
    • urls.py文件是配置要访问的url路径的(url中指向某个函数需先import导入该函数),
      这里介绍两种方法
      第一种:直接指定url路径
      第二种:在url后指定一个name=**
      适用于url路径经常变更的,这样写以后url变更时曾经写在html里对应的url路径就不需要跟着一一修改了。
      在html中用的时候直接使用这个name(原来是/detail?***,修改后用法:{% url 'xiangqing' %}?***from user.views import index,detail urlpatterns = [ path('index/', index), # 第一种 path('detail/', detail,name='xiangqing'), #第二种 ]

      html文件中对应两种方法的使用:

      第一种:<a href="/detail?id={{ article.id }}">
      第二种:<a href="{% url 'xiangqing' %}?id={{ article.id }}">

       

 如何将写的东西展示到页面

如果写一个东西想在页面上访问有三个步骤

  1. 首先要有一个html,
  2. 其次要在views.py里写实现的方法,
  3. 在urls.py里配置要访问的url。

反过来请求某一个链接的时候首先是在urls.py里查找是否有匹配的url,匹配到以后看该url对应的函数是什么(url中指向某个函数需先import导入该函数),再在views.py里查找该函数对应的内容及映射的是哪个html,

django的模版语言在html里要想取一个list的下标用.取,例如**.0,引用的变量的时候还是{{}}

循环的是用{% for * in * %} {% endfor %}

 

 如何建表

model是操作数据库的,所以我们需要在model.py下写表结构,使用的是Django自带的db.sqlite3数据库

  1. 首先在model.py里定义表结构(表里有id的话id不需要定义,会被自动创建)
  2. 第二步是生成表结构,命令:python manage.py makemigrations  。生成后会在子项目下产生一个migrations文件夹,里面是根据我们定义的类来生成的表结构的py文件,
  3. 第三步同步表到数据库,命令:python manage.py migrate

(如果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,db_index=True)  #CharField是字符串类型,必须指定最大长度,unique=True表示字段不能重复,db_index表示索引
    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)
models.TextField() #是超文本类型,存的内容非常多的时候用这个
models.ForeignKey() #外键,一对多的时候会用到
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

建表时如果表结构是带有上传图片的,有三步需要额外操作的

  1. 使用ImageField需要安装pip install pillow才可以使用,否则会报错
  2. upload_to指定图片放置的目录
  3. 在settings.py文件中指定路径MEDIA_ROOT,否则不知道要把目录放到哪,
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种方法:

  1. 数据库表里直接添加数据
  2. django自带一个后台管理页面工具,可在这里对自己创建的表进行增删改查

要想使用django自带的后台管理工具操作数据库,需做如下配置:

  1. 在urls.py里有一个配置的path是admin,只要访问url后面加admin即可打开后台管理工具页面
  2. 创建后台管理工具的超级用户  python manage.py createsuperuser
  3. 在子项目的admin.py中做简单的配置,配置完成后即可在页面对表进行操作:
    • 想在后台显示某个表,首先要导入models
    • 配置想在后台页面显示的数据库表名
例子:我们前面创建里一个表category
from django.contrib import admin

# Register your models here.

from . import models  #想在后台显示某个表,首先要导入models
admin.site.register(models.Category)  #配置这个后可以直接在页面操作数据库
admin.site.register(models.Article)

 

如何将创建的数据展示到页面中

  1. 逻辑要写在views.py
  2. 首先查数据需在views.py里导入models,查的数据是哪个表的就导入哪个表
  3. 如何在数据库中查数据,使用类名.objects.all()就表示查所有的数据
  4. 数据要展示到页面的哪一块?在html文件中找到相对应页面的位置,循环刚才查到的数据,取这个字段展示到页面即可(需注意的是:循环的内容实际是一个对象,要想将对象对应的字段展示到页面,要用**.**,即循环对象.字段名)
例子:
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> 

如何操作数据库的增删改查

  1. 首先import django,os
  2. 指定django的配置文件在哪里,配置自己项目名下的settings
  3. django.setup()
  4. 导入models下要操作的数据库表
  5. 此时就可以操作数据库啦
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)

# 或
# from django.db.models import Q
# r = Article.objects.filter( Q(category_id=1) | Q(category_id=2) )
posted @ 2019-12-29 00:44  塔塔~  阅读(2687)  评论(0编辑  收藏  举报