Django CRUD新增数据入库成功但读取页面不显示数据
问题背景
我是Django与PostgreSQL初学者,目前正在开发CRUD功能,已完成新增插入页面开发,提交的详情数据可成功写入数据库:
但写入的数据无法在读取展示页面正常显示:
现有代码如下:
views.py
def show_cat(request): showcategory = Categories.objects.filter(isactive=True) #print(showall) serializer = CategoriesSerializer(showcategory,many=True) #print(serializer.data) return render(request,'polls/show_cat.html',{"data":serializer.data}) def insert_cat(request): if request.method == "POST": insertcategory = {} insertcategory['category_name']=request.POST.get('category_name') insertcategory['category_description']=request.POST.get('category_description') form = CategoriesSerializer(data=insertcategory) if form.is_valid(): form.save() print("hkjk",form.data) messages.success(request,'Record Updated Successfully...!:)') return redirect('categories:show_cat') else: print(form.errors) return redirect('categories:show_cat') else: insertcategory = {} form = CategoriesSerializer(data=insertcategory) if form.is_valid(): print(form.errors) return render(request,'polls/insert_cat.html')
urls.py
from django.urls import path from categories import views from django.urls.conf import include from django.conf import settings from django.conf.urls.static import static urlpatterns=[ path('',views.show_cat,name="show_cat"), path('insert_cat/',views.insert_cat,name="insert_cat"), path('edit_cat/',views.edit_cat,name="edit_cat"), path('del_cat/',views.del_cat,name="del_cat") ]
已尝试多种排查方式,仍无法解决读取页面不展示数据的问题。
排查修复步骤
按以下顺序检查,可快速定位问题:
优先检查过滤逻辑把数据筛空了
你show_cat视图里只查询isactive=True的分类,但插入数据的逻辑里完全没有给isactive字段赋值。
去看Categories模型的isactive字段定义,如果没设置default=True,新插入的记录这个字段默认值是False或NULL,会直接被filter(isactive=True)过滤掉,查询结果为空自然页面没数据。
修复二选一即可:- 给模型字段加默认值:
isactive = models.BooleanField(default=True),改完依次执行python manage.py makemigrations、python manage.py migrate - 插入数据时手动赋值:在构造
insertcategory字典时加一行insertcategory['isactive'] = True
- 给模型字段加默认值:
检查模板渲染逻辑
先把show_cat视图里注释的print(serializer.data)放开,重启服务访问展示页,看控制台打印的内容:- 如果打印结果是空列表,回到第一步检查过滤条件和数据库里记录的
isactive字段值 - 如果打印结果里有你刚插入的数据,就是模板写错了:你传给模板的上下文变量名是
data,是序列化后的字典列表,模板里必须用{% for item in data %}做循环,取字段时要和序列化器输出的字段名完全一致,别拼错字段名、别写错循环的变量名。
可以先在模板里直接写{{ data }}测试,页面能输出字典格式的内容就说明数据传对了,再调整循环逻辑即可,参考正确写法:
<table> <thead> <tr> <th>分类名称</th> <th>分类描述</th> </tr> </thead> <tbody> {% for item in data %} <tr> <td>{{ item.category_name }}</td> <td>{{ item.category_description }}</td> </tr> {% empty %} <tr> <td colspan="2">暂无分类数据</td> </tr> {% endfor %} </tbody> </table>- 如果打印结果是空列表,回到第一步检查过滤条件和数据库里记录的
代码精简提示
你GET请求渲染插入页的那段代码完全多余,空数据跑is_valid()没有任何实际意义,直接删掉即可,精简后insert_cat的GET分支只需要留return render(request,'polls/insert_cat.html')就行。
内容的提问来源于stack exchange,提问作者Ameya Potdar
相关产品推荐
相关产品推荐

