acabo de empezar a aprender front-end y javascript. Entonces, anteriormente hice una API simple a través de Django Rest Framework. Y ahora, comience a probarlo a través de fetch-api de javascript. GET - no hay problema - funciona bien. POST: recibí un mensaje como: "415 Tipo de medio no compatible".
Aquí mi archivo html simplificado (tryjs.html) con solicitud POST de búsqueda incluida:
<!DOCTYPE html> <html> <head> </head> <body> <script> let myurl2 = "http://127.0.0.1:8000/myfamily/"; async function myfu() { let response = await fetch(myurl2, { mode: "no-cors", method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify({firstname: "first", secondname: "second"}) }) }; myfu(); </script> </body> </html>Parece bastante simple y nada especial.
Aquí, el modelo.py de drf:
from django.db import models class Family(models.Model): firstname = models.CharField(max_length=20) secondname = models.CharField(max_length=20) def __str__(self): return self.firstnameY serializadores.py:
from rest_framework import serializers from .models import Family class FamilySerializer(serializers.ModelSerializer): class Meta: model = Family fields = ('firstname', 'secondname')Y ver:
from rest_framework import viewsets from .models import Family from .serializers import FamilySerializer class FamilyViewSet(viewsets.ModelViewSet): queryset = Family.objects.all() serializer_class = FamilySerializerY urls.py de aplicaciones (agregado a urls.py de proyecto):
from django.urls import path from rest_framework.routers import SimpleRouter from .views import FamilyViewSet from django.views.generic import TemplateView router = SimpleRouter() router.register('', FamilyViewSet, basename="family") urlpatterns = [ path('tryjs/', TemplateView.as_view(template_name="tryjs.html")), ] urlpatterns += router.urlsHago la solicitud GET y POST a través del cartero; todo funciona bien. Hago la solicitud GET a través de un script javascript (he eliminado esta parte del código anterior), funciona bien. Tan pronto como intento hacer una solicitud POST a través del script js anterior, obtengo una falla sobre el tipo de medio incorrecto. Por favor ayuda. Intenté mucho. Y es un caso tan simple. Sin embargo... no funciona(
está obteniendo un tipo de medio incorrecto porque ha establecido mode: "no-cors" , lo que hace que el encabezado Content-Type sea inmutable. por lo que establecerlo en "application/json" se transformará automáticamente en "text/plain" . mantener el mode :"cors" y funcionará.
No es necesario que escriba el código js usted mismo, obtendrá el código del cartero. intenta usar eso