Django REST如何向包含JSONField的已有模型提交联系人表单数据
实现方案
以下基于Django生态给出可直接落地的实现逻辑,全程不需要新建Contacts模型:
1. 定义字段校验规则
首先定义非模型绑定的序列化器/表单,用来校验提交的字段合法性,规则和你原Contacts模型的字段约束保持一致:
如果你用DRF(Django REST Framework)开发接口
from rest_framework import serializers class ContactFormSerializer(serializers.Serializer): full_name = serializers.CharField(max_length=100, allow_blank=True, default="") email = serializers.EmailField() phone = serializers.CharField(max_length=16) address = serializers.CharField(max_length=255, allow_blank=True, default="") message = serializers.CharField()
如果你用原生Django开发接口
from django import forms class ContactForm(forms.Form): full_name = forms.CharField(max_length=100, required=False, empty_value="") email = forms.EmailField() phone = forms.CharField(max_length=16) address = forms.CharField(max_length=255, required=False, empty_value="") message = forms.CharField(widget=forms.Textarea)
2. 编写POST接口逻辑
我们用固定值contact_form作为Core模型的slug标识,方便后续筛选所有联系表单留言,校验通过的字段直接作为字典存入JSONField字段example即可:
DRF视图代码
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from .models import Core from .serializers import ContactFormSerializer class ContactFormSubmitView(APIView): def post(self, request): # 校验参数合法性 serializer = ContactFormSerializer(data=request.data) serializer.is_valid(raise_exception=True) # 直接存入Core模型 Core.objects.create( slug="contact_form", example=serializer.validated_data ) return Response({"status": "success", "msg": "留言提交成功"}, status=status.HTTP_201_CREATED)
原生Django视图代码
from django.http import JsonResponse from .models import Core from .forms import ContactForm def contact_submit(request): if request.method != "POST": return JsonResponse({"status": "error", "msg": "仅支持POST请求"}, status=405) form = ContactForm(request.POST) if not form.is_valid(): return JsonResponse({"status": "error", "msg": "参数错误", "errors": form.errors}, status=400) # 直接存入Core模型 Core.objects.create( slug="contact_form", example=form.cleaned_data ) return JsonResponse({"status": "success", "msg": "留言提交成功"}, status=201)
3. 配置路由
DRF路由
from django.urls import path from .views import ContactFormSubmitView urlpatterns = [ path('api/contact/submit/', ContactFormSubmitView.as_view(), name='contact_submit'), ]
原生Django路由
from django.urls import path from .views import contact_submit urlpatterns = [ path('api/contact/submit/', contact_submit, name='contact_submit'), ]
附加说明
- 后续查询所有联系表单留言直接执行
Core.objects.filter(slug="contact_form")即可,每个实例的example字段会自动反序列化为字典,可直接读取各个表单字段 - 如果需要区分不同场景的联系表单,可自定义不同的slug值做分类,无需调整模型结构
内容的提问来源于stack exchange,提问作者Reactoo
相关产品推荐
相关产品推荐

