急需一个会DJango的伙伴协助完成一个简单的CRUD,现在卡在如何修改数据库内容!可以援助的请私信!
目的是点击黄色的edit以后,可以更改moody box这个名字。
error
model
views
urls
template
{% extends "base.html" %}
{% load crispy_forms_tags %}
{% load static %}
{% block content %}
<!--Main Navigation-->
<header>
{% include 'mood/nav.html' %}
<!-- Background image -->
<div id="intro" class="p-5 text-center bg-image shadow-1-strong ">
<div class="mask bg-color ">
<div class="d-flex justify-content-center align-items-center h-100">
<div class="px-4 bg-light bg-gradient text-black-50">
<div class="my-4"></div>
<h4 class="border border-light my-4 p-4">
<span class="text-warning">{{ profile.name }}</span>
Profile
</h4>
<form
action="{% url 'edit_profile' user %}"
method="POST"
enctype="multipart/form-data"
class="my-4 p-4"
>
{% csrf_token %}
<table class="table align-middle mb-0 bg-white">
<tbody>
<tr>
<!-- Name -->
<th>Name</th>
<td>
<p class="fw-normal mb-1">{{ profile.name }}</p>
</td>
<!-- Action -->
<td>
<button type="button" class="btn btn-warning btn-sm btn-rounded">
<a href="{% url 'edit_profile' user %}">Edit</a>
</button>
</td>
<td>
<!-- Button trigger modal -->
<button
type="button"
class="btn btn-link btn-sm btn-rounded"
data-mdb-toggle="modal"
data-mdb-target="#exampleModal"
>
Edit
</button>
<!-- Modal -->
<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Edit Profile</h5>
<button type="button" class="btn-close" data-mdb-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="col-12">
name: {{ form.as_p}}
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-mdb-dismiss="modal">Close</button>
<button type="submit" class="btn btn-primary">Save changes</button>
</div>
</div>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</form>
<div class="my-4"></div>
</div>
</div>
</div>
</div>
<!-- Background image -->
</header>
<hr class="m-0" />
{% include 'mood/footer.html' %}
{% endblock %}
详细讲讲
Django 有自己的ORM,可以直接利用ORM来完成常见的数据库操作,太复杂的语句从设计上应该避免,无法避免的ORM也支持原生sql语句。
1. 通过ORM向DB中增加数据: Entry.objects.create(属性=值,属性=值)
1. create创建
Author.objects.create(name='zsf',age=85)
2、创建一个 Models 对象,通过对象的 save() 完成增加
obj = Author(names='laoshe',age=65)
obj.save()
3、使用字典构建对象,通过 save() 完成增加
dic = {
'属性1':'值1',
'属性2':'值2',
}
obj = Entry(**dic)
obj.save()
2. 查询操作(重难点)
通过Entry.objects调用查询接口
1. 基本查询操作 all()
用法: Entry.objects.all()
返回: QuerySet
2. 查询指定列 values('列1','列2',……)
用法: Entry.objects.values('列1','列2',……)
返回: QuerySet
ex: Entry.objects.all().values('names', 'age')
3. 根据条件查询部分行数据 Entry.objects.filter(参数)
1. 使用Entry属性作为查询参数
多个参数的话使用','隔开,映射到sql语句上,是使用and来进行关联的
ex: Author.objects.filter(id=1,name='莫言') ==
select * from Author where id =1 and name ='莫言'
2. 通过Field Lookup(查询表达式)完成复杂条件构建
查询表达式: 每个查询表达式都是一个独立的查询条件,可以用在所有的有查询条件的位置处
1. __exact 作用: 精确查询,等值判断
用法: Entry.objects.filter(属性__exact=值)
ex: Author.objects.filter(id__exact=1) == select * from Author where id = 1
2. __contains作用: 筛选出属性中包含指定关键字的记录(模糊查询)
ex:
Author.objects.filter(names__contains = 'ao')
select * from Author where names like '%ao%'
3. __lt 作用:筛选出属性值小于指定值的记录
4. __lte 作用:筛选出属性值小于等于指定值的记录
5. __gt, __gte
6. __startswith, __endwith
3. 查询值返回一条数据get(条件)
用法: Entry.objects.get(查询条件/表达式)
注意: 该函数值适用于返回一条记录时使用
3. 修改数据
1. 通过get()得到要修改的实体对象
2. 通过实体对象属性修改属性值
3. 再通过实体对象的save()保存回数据库
4. 删除数据 调用实体对象/查询结果集的delete()即可
1. 删除单个对象 Author.objects.get(id=1).delete()
2. 删除多个对象 Author.objects.all().delete()
5. F()操作 在执行操作中,获取某列的值时使用
F('列名')
from django.db.models import F
Author.objects.all().update(age=F('age') + 10)
6. Q()操作 在查询条件中,可以完成或(or)的操作.如果只是为了完成and操作的话,那么直接filter逗号隔开就行
from django.db.models import Q
# Q(表达式) | Q(表达式)
# ex: 查询Author实体中,id为6或者大于等于70的人的信息
Author.objects.filter(Q(id=6)|Q(age__gte=70))
# 等效于 select * from index_author where id=6 or age>=70
7. 原生的数据库操作方法
1. 查询 函数:raw(sql)
语法:Entry.objects.raw(sql)
2. 增删改
with connection.cursor() as cursor:
sql = 'delete from author'
cursor.execute(sql)
return HttpResponse('……')/return HttpResponseRedirect('……')