手记

学习Django + xadmin开发在线教育网站 (2) Django Review

一、目录回顾

  1. 虚拟环境

  2. 安装django

  3. django-admin命令

  4. app 配置推荐:

    • settings.py中 : 这样配置注册app:

        INSTALLED_APP = [
        						'appname.apps.MessageFormConfig'
        						]
      
  5. 增加的其他文件夹或文件

  • static :存放css\js\image文件
  • templates :存放 html文件
  • apps : 统一存放app文件
  • extra_app : 统一存放第三方app文件
  • requirements.txt :记录项目安装和依赖的文件以及版本号

  1. 在settings.py中添加 templates目录:
  • ‘DIRS’: [os.path.join(BASE_DIR, ‘templates’)]
     

二、留言板功能回顾Django知识

  • views.py 返回留言板html文件

  • urls.py先导入需要的视图函数,然后设置访问url地址和所需的视图函数

      urlpattern = [
      	path('message_form/', message_form)
      	]
    

2. 配置一个HTML页面显示的步骤:

  • 配置url
  • 配置相对应的view的逻辑
  • 拆分静态文件(img,css,js)放置到static文件夹中,html文件放置到templates文件夹中。两种放法:
    - 放置到app中
    - 放置到全局的 static和templates文件夹中
  • 配置全局的static方法为 settings.py中,STATICFILES = [ path ]

3. 设计model,建表

  • 先安装mysqlclient,连接数据库的工具

  • 修改settings.py, 写入连接mysql的配置

      	DATABASES = {
          'default': {
              'ENGINE': 'django.db.backends.mysql',
              'HOST': '127.0.0.1',
              'PORT': '3307',
              'USER': 'root',
              'PASSWORD': 'root',
              'NAME': 'mxonline',
          }
      }
    
  • 编写model.py,定义主键,编写表的列信息,以及元数据Meta

  • 执行makemigrations : 在app下创建migrations目录,并记录下所有关于model.py的改动,但没有作用到数据库。

  • 执行migrate : 将该变动作用到数据库文件

from django.db import models

""" 创建表对象 """
class Message(models.Model):
    name = models.CharField(max_length=20,verbose_name="姓名",primary_key = True)
    email = models.EmailField(verbose_name="邮箱")
    address = models.CharField(max_length=100,verbose_name="地址")
    message = models.TextField(verbose_name="留言信息")

    """ 元素据 """
    class Meta:
        verbose_name = "留言信息"
        verbose_name_plural = verbose_name
        db_table = "message"

4.model进行增、删、改、查

在 views.py中导入model的表对象

 

获取数据:

  • 获取全部数据 all( ) 方法
  • 只能获取一条数据 get( ) 方法
  • 获取部分满足条件的数据 fliter( ) 过滤方法

 

QuerySet :获取的数据是queryset这种python的内置对象

queryset对象必须经过for循环后,才能变为一个普通的对象

  • queryset对象,可以for循环,也可以进行切片 [ :1]

  • queryset本身没有执行sql操作,只是组成了sql的语句。for循环执行后才进行了sql操作

  • 查看sql语句

      		print(all_message.query)
    

 

filter方法

过滤方法

		all_message = Message.objects.filter(name='Ethan')

 

get方法

get( )返回的是一个对象,而不再是queryset对象
并且,数据不存在或存在多条,会抛出异常
不再需要for循环
get( ) 直接开始查询数据库
异常操作:
- 不存在数据: XXX.DoesNotExist
- 存在多个数据 : XXX.MultipleObjectsReturned

    try:
        all_message = Message.objects.get(name='Ethan1')
        print(all_message.name)
    except Message.DoesNotExist as e:
        pass
    except Message.MultipleObjectsReturned as e:
        pass

 
 

删除数据

  1. queryset对象时,可以直接调用delete( )方法
  2. 普通对象时,也可以直接调用delete()方法
  3. 批量删除时,可以使用for循环
     
     

插入数据

  1. 创建变量var,生成表对象Message( );
  2. 变量var使用表的列名进行赋值
  3. 调用 save( )方法进行保存,提交到数据库
	message = Message()
    message.name = 'Uuu'
    message.email = '7@qq.com'
    message.address = '贵阳'
    message.message = '留言信息1'
    message.save()

 

修改数据

  • save( ) 两种含义:
    - 如果不存在相同数据,就插入保存
    - 如果存在,则更新
    - 如何辨别相同数据与否,依靠主键判断。

 
 

从前端HTML页面获取数据并保存

  1. < form >表单中的action要指定对应的url,并指定方法是get还是post
  2. url如果是同用一个,那么需要区别get和post方法,以便执行不同的操作
  3. 提交数据时request对象是 QueryDIct对象,可以按照字典操作。
  4. 获取前端数据
  5. 保存数据
    if request.method == "POST":
        # 获取前端输入的数据
        name = request.POST.get("name","")
        email = request.POST.get("email","")
        address = request.POST.get("address","")
        my_message = request.POST.get("message","")
        # 保存到数据库
        message = Message()
        message.name = name
        message.email = email
        message.address = address
        message.message = my_message
        message.save()

 
 

template数据展示

  1. 判断http方法
  2. 数据库取得数据(数据是否存在)
  3. render返回到模板中
  4. html中的变量修改

初始代码:

  if request.method == "GET":
        # 从数据库获取数据
        all_message = Message.objects.all()
        if all_message:
            # 取数据的第一个
            message = all_message[0]

            return render(request, "form1.html",{
                "message":message
        })
    # 假如数据库中没有数据
    else:
        return render(request,"form1.html")

 
进一步优化代码:

   if request.method == "GET":
        all_message = Message.objects.all()
        var_dict = {}
        if all_message:
            message =all_message[0]
            var_dict = {
                "message":message
            }
        return render(request,"form1.html",var_dict)

 
5. 注意事项: views.py中,在任何可能结束的分支,都必须返回一个render,或者HttpResponse。
 
 
6. Django 严格限制了templates中的模板语法,模板中不会插入过多的python后端语法。方便日后维护模板。那么html的值怎么获得?

  • 方法一: 在views.py中处理逻辑,获得结果后,返回到html中。
  • 方法二:定义模板中的tag方法,较为麻烦。
     
     
  1. 模板语法:
    模板语法

在html中实现更多的逻辑功能,但不会过于复杂,与后端联系不大。
判断,过滤,继承等都可以

	例如判断: value="{% if message.name == "Sense" %} Sense1 {% endif %} "
	例如过滤: value="{% ifequal message.name|slice:'2' 'Se' %} Ethan {% endifequal %}"
0人推荐
随时随地看视频
慕课网APP