如何将Django中存入数据库的收藏房产数据改为存储到session中
代码调整方案
1. 视图函数(views.py)修改
原来的逻辑是操作Favorito数据库表,调整后直接将收藏的房产ID存储到用户session中,代码如下:
import json from .models import Inmueble def updateFavoritos(request): # 初始化session中的收藏ID列表,首次访问时创建空列表 if 'favoritos_ids' not in request.session: request.session['favoritos_ids'] = [] inmuebleId = None if request.body: data = json.loads(request.body) inmuebleId = str(data['id']) # 避免重复添加同一房产 if inmuebleId not in request.session['favoritos_ids']: request.session['favoritos_ids'].append(inmuebleId) # 标记session已修改,强制Django保存更新 request.session.modified = True # 查询所有已收藏的房产对象传给模板 favs = Inmueble.objects.filter(id__in=request.session['favoritos_ids']) contexto = { 'id': inmuebleId, 'favoritos': favs, } return render(request, 'favorites.html', contexto)
2. HTML模板调整
因为现在传递给模板的favoritos是直接查询出来的Inmueble房产对象,不需要再通过inmueble外键关联取值,所以需要把模板中所有favorito.inmueble前缀修改为favorito,同时调整删除按钮的逻辑:
{% for favorito in favoritos %} <div class="col-lg-6 col-xl-4"> <div class="feat_property"> <div class="thumb"> <!-- 修改点:去掉.inmueble后缀 --> <img class="img-whp" src="{{ favorito.imagen.url }}" alt="fl1.jpg"> <div class="thmb_cntnt2"> <ul class="listing_gallery mb0"> <li class="list-inline-item"><a class="text-white" href="#"><span class="flaticon-photo-camera mr5"></span> 22</a></li> <li class="list-inline-item"><a class="text-white" href="#"><span class="flaticon-play-button mr5"></span> 3</a></li> </ul> </div> </div> <div class="details"> <div class="tc_content"> <!-- 修改点:去掉.inmueble后缀 --> <h4><a href="page-listing-single-v8.html">{{ favorito.nombre }}</a></h4> <p>251 SW 6th Ln Florida City, FL</p> <ul class="prop_details mb0"> <li class="list-inline-item"><a href="#"><span class="flaticon-bed"></span> <br>4 Cuartos</a></li> <li class="list-inline-item"><a href="#"><span class="flaticon-bath"></span> <br>5 Baños</a></li> <li class="list-inline-item"><a href="#"><span class="flaticon-car"></span> <br>1 Garage</a></li> <li class="list-inline-item"><a href="#"><span class="flaticon-ruler"></span> <br>1200 M2</a></li> </ul> </div> <div class="fp_footer"> <ul class="fp_meta float-left mb0"> <li class="list-inline-item"> <a href="#"> <small><del class="body-color">$2,800/mo</del></small><br> <span class="heading-color fw600">$2,300/mo</span> </a> </li> </ul> <ul class="fp_meta float-right mb0"> <li class="list-inline-item"><a class="icon" href="#"><span class="flaticon-resize"></span></a></li> <li class="list-inline-item"><a class="icon" href="#"><span class="flaticon-add"></span></a></li> <li class="list-inline-item"> <!-- 删除链接改为传递房产ID,对应修改删除视图逻辑即可 --> <a href="{% url 'eliminar' favorito.id %}"><button class="btn btn-outline-danger">Borrar</button></a> </li> </ul> </div> </div> </div> </div> {% endfor %}
3. 删除功能适配
原来的删除视图是删除Favorito表的记录,调整后只需要将对应房产ID从session的favoritos_ids列表中移除即可,示例代码如下:
def eliminar_favorito(request, inmueble_id): if 'favoritos_ids' in request.session: inmueble_id = str(inmueble_id) if inmueble_id in request.session['favoritos_ids']: request.session['favoritos_ids'].remove(inmueble_id) request.session.modified = True # 重定向回收藏列表页 return redirect('favoritos_list')
注意事项
- 默认创建的Django项目都会在
INSTALLED_APPS和MIDDLEWARE中配置好session相关组件,无需额外修改即可正常使用 - session存储的收藏数据仅对应当前用户的浏览器会话,清除浏览器缓存、更换设备或会话过期后收藏数据会丢失
- 如果需要持久化存储收藏数据,还是建议保留数据库存储方案
内容的提问来源于stack exchange,提问作者erick sanchez vital
相关产品推荐
相关产品推荐

