试图将数组发送到django数据库,但出现错误,提示方法不允许

问题描述 投票:0回答:1

我是Django的新手。我正在开发一个应用程序,用户可以在其中输入活动名称和时间。然后将其显示为图形。当用户保存它时,数据将通过序列化最终成为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 /error message任何替代方法都非常感谢。

javascript django charts django-rest-framework xmlhttprequest
1个回答
0
投票

请参见@api_view() docs

默认情况下,仅接受GET方法。您需要将行更改为:

@api_view(['GET', 'POST'])
def page_list(request):
   # your code here
© www.soinside.com 2019 - 2024. All rights reserved.