如何从Django视图向模型传数据?解决JSON存储及模型显示问题
解决你的两个核心问题:后台找不到模型 + 保存JSON到数据库的视图函数
一、先搞定后台管理看不到update_grid模型的问题
后台搜不到模型,基本逃不出这几个原因,按顺序排查就行:
1. 模型没在
admin.py里注册
你得把update_grid模型手动注册到后台管理系统里,代码示例如下:from django.contrib import admin from .models import update_grid # 要是模型在其他子app里,记得调整导入路径 admin.site.register(update_grid)顺带提一句:如果这个模型所在的app没加到
settings.py的INSTALLED_APPS里,Django根本不会识别到它,先确认这一步!2. 模型定义有语法错误
打开models.py检查update_grid的代码,有没有漏写括号、字段定义错的情况,比如这种错误:class update_grid(models.Model): data = JSONField # 这里少了括号!应该是JSONField() created_at = models.DateTimeField(auto_now_add=True)正确的JSON字段定义(Django 3.1+支持原生JSONField)建议这么写,顺便符合PEP8规范:
from django.db import models class UpdateGrid(models.Model): # 模型类名用大驼峰更符合Django惯例 grid_data = models.JSONField(default=dict) # 给个默认空字典避免空值问题 updated_at = models.DateTimeField(auto_now=True) def __str__(self): return f"Grid Update {self.id}"3. 没执行数据库迁移
刚建的模型必须同步到数据库才行,跑这两条命令:python manage.py makemigrations python manage.py migrate执行完刷新后台管理页面,应该就能看到模型了。
二、写个能接收前端JSON并保存的视图函数
假设你前端用AJAX(fetch/axios)发数据,分两种常见写法给你参考:
写法1:函数视图(简单直接)
from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt # 前端没带CSRF令牌时用,生产环境建议带令牌 from .models import UpdateGrid import json @csrf_exempt def save_grid_data(request): if request.method == 'POST': try: # 解析前端传的JSON数据 grid_json = json.loads(request.body) # 保存到数据库 UpdateGrid.objects.create(grid_data=grid_json) # 要是需要更新已有数据,换成下面的代码: # grid_item = UpdateGrid.objects.get(id=你要更新的ID) # grid_item.grid_data = grid_json # grid_item.save() return JsonResponse({'status': 'success', 'msg': '数据保存成功'}) except Exception as e: return JsonResponse({'status': 'error', 'msg': str(e)}, status=400) else: return JsonResponse({'status': 'error', 'msg': '只接受POST请求'}, status=405)
然后在urls.py里配个路由:
from django.urls import path from .views import save_grid_data urlpatterns = [ # 其他路由... path('save-grid/', save_grid_data, name='save_grid'), ]
写法2:类视图(更符合Django的类式风格)
from django.views import View from django.http import JsonResponse from .models import UpdateGrid import json class SaveGridDataView(View): def post(self, request): try: grid_json = json.loads(request.body) UpdateGrid.objects.create(grid_data=grid_json) return JsonResponse({'status': 'success'}) except Exception as e: return JsonResponse({'status': 'error', 'msg': str(e)}, status=400)
路由配置改成这样:
path('save-grid/', SaveGridDataView.as_view(), name='save_grid'),
前端发送JSON的示例(用fetch)
// 假设你的JSON变量是gridData const gridData = { rows: 10, columns: 5, cells: [{x:0,y:0,value:"hello"}, {x:1,y:1,value:"world"}] }; fetch('/save-grid/', { method: 'POST', headers: { 'Content-Type': 'application/json', // 要是用Django模板,记得带上CSRF令牌: // 'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value }, body: JSON.stringify(gridData) }) .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('保存失败:', error));
额外小提示
- 生产环境别乱用
csrf_exempt,最好让前端带上CSRF令牌,安全性更高。 - 如果JSON结构固定,也可以考虑用
models.JSONField()加validators做数据校验,避免脏数据进数据库。
内容的提问来源于stack exchange,提问作者Rookie_123
相关产品推荐
相关产品推荐

