一、目录回顾
-
虚拟环境
-
安装django
-
django-admin命令
-
app 配置推荐:
-
settings.py中 : 这样配置注册app:
INSTALLED_APP = [ 'appname.apps.MessageFormConfig' ]
-
-
增加的其他文件夹或文件
- static :存放css\js\image文件
- templates :存放 html文件
- apps : 统一存放app文件
- extra_app : 统一存放第三方app文件
- requirements.txt :记录项目安装和依赖的文件以及版本号
- 在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
删除数据
- queryset对象时,可以直接调用delete( )方法
- 普通对象时,也可以直接调用delete()方法
- 批量删除时,可以使用for循环
插入数据
- 创建变量var,生成表对象Message( );
- 变量var使用表的列名进行赋值
- 调用 save( )方法进行保存,提交到数据库
message = Message()
message.name = 'Uuu'
message.email = '7@qq.com'
message.address = '贵阳'
message.message = '留言信息1'
message.save()
修改数据
- save( ) 两种含义:
- 如果不存在相同数据,就插入保存
- 如果存在,则更新
- 如何辨别相同数据与否,依靠主键判断。
从前端HTML页面获取数据并保存
- < form >表单中的action要指定对应的url,并指定方法是get还是post
- url如果是同用一个,那么需要区别get和post方法,以便执行不同的操作
- 提交数据时request对象是 QueryDIct对象,可以按照字典操作。
- 获取前端数据
- 保存数据
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数据展示
- 判断http方法
- 数据库取得数据(数据是否存在)
- render返回到模板中
- 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方法,较为麻烦。
- 模板语法:
模板语法
在html中实现更多的逻辑功能,但不会过于复杂,与后端联系不大。
判断,过滤,继承等都可以
例如判断: value="{% if message.name == "Sense" %} Sense1 {% endif %} "
例如过滤: value="{% ifequal message.name|slice:'2' 'Se' %} Ethan {% endifequal %}"
共同学习,写下你的评论
评论加载中...
作者其他优质文章