javascript - 尝试将数组发送到 django 数据库但收到错误说方法不允许
问题描述
我是 Django 的新手。我正在开发一个用户输入活动名称和时间的应用程序。然后将其显示为图表。当用户保存它时,数据将通过序列化最终成为一种JSON
格式。我现在的问题是它只保存用户输入的最后一个值,而不是所有输入。我正在尝试将数组存储到 Django 数据库中。我找到了多个答案,但没有任何帮助。我想可能会发出一个 HTTP 请求来发送该值,但任何替代方案都会到期。
视图.py
from django.shortcuts import render
from django.core import serializers
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_protect
from page.templates.forms import ActivitiesForm
from page.models import Activities
from .serializers import ActivitiesSerializer
from rest_framework.parsers import JSONParser
from rest_framework.decorators import api_view
from rest_framework.decorators import parser_classes
from rest_framework.response import Response
@api_view()
def page_list(request):
if request.method == 'GET':
activities = Activities.objects.all()
serializer = ActivitiesSerializer(activities, many=True)
return Response(serializer.data)
elif request.method == 'POST':
# data = JSONParser().parse(request)
serializer = ActivitiesSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=201)
return Response(serializer.errors, status=400)
@csrf_protect
def page_detail(request, pk):
try:
activities = Activities.objects.get(pk=pk)
except Activities.DoesNotExist:
return HttpResponse(status=404)
if request.method == 'GET':
serializer = ActivitiesSerializer(activities)
return JsonResponse(serializer.data)
elif request.method == 'PUT':
data = JSONParser().parse(request)
serializer = ActivitesSerializer(activities, data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data)
return JsonResponse(serializer.errors, status=400)
elif request.method == 'DELETE':
activities.delete()
return HttpResponse(status=204)
@csrf_protect
def page_show_view(request):
a = Activities.objects.all()
activities = serializers.serialize("json", a)
return render(request, "page_show_view.html", {'activities':a})
def home_view(request, *args, **kargs):
form = ActivitiesForm(request.POST or None)
# context_instance=RequestContext(request)
if form.is_valid():
form.save()
context = {
'form': form
}
return render(request, "home_view.html", context)
模型.py
from base.models import CommonInfo
# Create your models here.
class Activities(CommonInfo):
activity = models.CharField(max_length = 15)
time = models.CharField(max_length = 15)
序列化程序.py
from .models import Activities
class ActivitiesSerializer(serializers.ModelSerializer):
activity = serializers.CharField(max_length = 15)
time = serializers.CharField(max_length = 6)
def create(self, validated_data):
return Activities.objects.create(**validated_data)
def update(self, instance, validated_data):
instance.activity = validated_data.get('activity', instance.activity)
instance.time = validated_data.get('time', instance.time)
return instance
class Meta:
model = Activities
fields = ('activity', 'time')
网址.py
from django.urls import path
from page import views
urlpatterns = [
path('page/', views.page_list),
path('page/<int:pk>/', views.page_detail),
]
home_view.html
{% extends 'base.html' %}
{% load static %}
{% block content %}
<main>
<div>
<h1>Time Management</h1>
<form action='/page/'method='POST' autocomplete="off" enctype="multipart/form-data" >{% csrf_token %}
{{form.as_p}}
<select name="" id="Time">
<option value="Select" default>Select time</option>
<option value="Hours" id="hours">Hours</option>
<option value="Min" id="Min">Minutes</option>
</select>
<br>
<br>
<input type="button" id="ActivityButton" value="Add Activity" onclick="addValue()">
<input type="submit" id="ActivityButton" value="Save">
</form>
</div>
</main>
<script src="{% static 'js/app.js' %}"></script>
{% endblock %}
应用程序.js
let hour = 24
// declare chart variable and dataSet variable
var chart, dataSet;
anychart.onDocumentLoad(function () {
// create an instance of a pie chart
chart = anychart.pie();
// create dataSet and add some initial data
dataSet = anychart.data.set(["Undocumented time", hour]);
// set the inital data
chart.data(dataSet);
chart.innerRadius("30%");
chart.background().fill({
keys: ["whitesmoke"]
});
// set the container element and draw
chart.container("container").draw();
// create and configure a label
var label = anychart.standalones.label();
label.text("Activities");
label.width("100%");
label.height("80%");
label.fontColor("white");
label.hAlign("center");
label.vAlign("middle");
// set the label as the center content
chart.center().content(label);
});
// set data to chart when user performs an action
function addValue(){
var minPerc = 60
var minCalc;
// read values from inputs
var name = document.getElementById('id_activity').value;
var value = document.getElementById('id_time').value;
var option = document.getElementById('Time').value;
// appendn name value pair to dataSet
if(hour > 0){
if(option == "Min"){
//Set hour
minCalc = value / minPerc
hour = hour - minCalc;
dataSet.row(1, ["Undocumented time", hour])
dataSet.append([name, minCalc]);
}
else if(option == "Hours"){
hour = hour - value;
dataSet.row(1, ["Undocumented time", hour])
dataSet.append([name, value]);
}
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = cookies[i].trim();
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var csrftoken = getCookie('csrftoken');
var xhttp = new XMLHttpRequest();
xhttp.open("POST", "http://localhost:8000/page/", true);
xhttp.setRequestHeader('X-CSRFToken', csrftoken);
xhttp.setRequestHeader("Content-Type", "application/json; charset=utf8");
xhttp.setRequestHeader('Accept', 'application/json');
xhttp.send(JSON.stringify(dataSet.jc))
console.log(dataSet.jc)
}
}
问题:
不断收到错误消息说方法不允许:/page/错误消息 非常感谢任何替代方法。
解决方案
请参阅@api_view() 文档。
默认情况下,只接受 GET 方法。您需要将您的线路更改为:
@api_view(['GET', 'POST'])
def page_list(request):
# your code here
推荐阅读
- react-native - 我正在使用'react-native-dropdown-picker';我想在 react native 中显示从 sqlite db 到下拉列表的值,我该怎么做?
- r - 如何从由列表和向量组成的矩阵中删除包含 NULL 的单元格?
- r - 向多折线图添加图例和数据标签
- rust - UnixStream::send 是否有可能返回 EWOULDBLOCK?
- javascript - 有没有办法在反应中映射一组对象并从 cloudinary 获取相关图像
- django - 我正在使用 ajax 设置上传数据的视图,但它仅适用于第一项
- kendo-ui - 编辑模式期间的剑道网格禁用字段
- python - 在这种情况下,“如果某事 == 真”和“如果某事:”有什么区别?
- aws-lambda - 有什么方法可以检查 lambda 函数是否在给定时间内空闲?
- ansible - Ansible如何使用expect回答密码重置提示?