You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:22:48