Я новичок в Джанго. Я работаю над приложением, в котором пользователь вводит название действий и время. Затем он отображает его в виде графика. Когда пользователь сохраняет его, данные сериализуются в формате JSON
через сериализацию. Моя проблема сейчас заключается в том, что он сохраняет только последнее значение пользовательского ввода, а не весь ввод. Я пытаюсь сохранить массив в базе данных Django. Я нашел несколько ответов, но никто не помог. Я полагаю, что, возможно, сделать HTTP-запрос на отправку значения, но любой другой вариант будет.
view.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)
models.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)
serializers.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')
urls.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 %}
app.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 / сообщение об ошибке Любая альтернатива очень ценится.