"<field>": ["Questo campo è obbligatorio."] Messaggio Django REST framework

Nov 17 2020

quindi oggi ho provato a implementare il framework Django REST per la prima volta nel mio progetto, tutto ha funzionato bene Posso creare, aggiornare ed eliminare post utilizzando l'interfaccia del browser fornita dal framework, ma dopo aver integrato il token JWT e provando a creare un post usando curl ricevo sempre il messaggio "": ["Questo campo è obbligatorio."]. Ho provato a risolverlo in molti modi, ma non c'è modo di analizzare i campi di cui ho bisogno correttamente. Sono stato anche in grado di creare un post utilizzando curl, ma ho dovuto modificare i campi in modo che fossero tutti "null". Sto inviando una richiesta di ricciolo sbagliata?

curl: (nota che se aggiungo -H "Content-Type: application / json" ottengo questo output {"detail":"JSON parse error - Expecting property name enclosed in double quotes: line 1 column 2 (char 1)"}che è già stato risolto qui Errore di analisi Json utilizzando POST in django rest api rimuovendo l'intestazione del tipo di contenuto) modifica: ignora cosa Ho appena detto che deve avere l'intestazione del tipo di contenuto, è stato un malinteso da parte mia

 curl -X POST -H  "Authorization: JWT <token>" -d '{
                    "title": "Helloooo",
                    "content": "Hi",
                    "schools": null,
                    "course": null,
                    "classes": [
                        1
                    ],
                    "isbn": 12312,
                    "semester": null,
                    "visible": false

}' 'http://127.0.0.1:8000/api/posts/create/?type=post'

Questo è l'output che ottengo dal terminale dopo aver inviato la richiesta POST:

 {"title":["This field is required."],"content":["This field is required."],"classes":["This list may not be empty."]}

Ecco il resto del mio codice:

Serializzatori:

class PostCreateSerializer(ModelSerializer):

    date_posted = serializers.HiddenField(default=timezone.now)

 class Meta:
        model = Post
        fields = [
 "title",
 "content",
 "schools",
 "course",
 "classes",
 "isbn",
 "semester",
 "visible",
 "date_posted",
        ]

Visualizzazioni:

class PostCreateAPIView(CreateAPIView):
    queryset = Post.objects.all()
    serializer_class = PostCreateSerializer

 def perform_create(self, serializer):
        serializer.save(author=self.request.user)

URL:

urlpatterns = [
    path(r"", PostListAPIView.as_view(), name="List-API"),
    path("create/", PostCreateAPIView.as_view(), name="Create-API") ]

Impostazioni:

REST_FRAMEWORK = {
    "DEFAULT_RENDERER_CLASSES": [
        "rest_framework.renderers.JSONRenderer",
        "rest_framework.renderers.BrowsableAPIRenderer", 
    ],
    "DEFAULT_AUTHENTICATION_CLASSES": [
        "rest_framework.authentication.SessionAuthentication", 
        "rest_framework_jwt.authentication.JSONWebTokenAuthentication"
    ],
    "DEFAULT_PERMISSION_CLASSES": [
        "rest_framework.permissions.IsAuthenticated"  
    ],
}

Grazie per aver dedicato del tempo a leggere tutto questo!

Risposte

SeyyedSajjadSanikhani Nov 18 2020 at 00:52

Il problema probabilmente è nella tua richiesta con curl .
Consiglio invece di usare Postman .

Ma se vuoi usare curl , per l'invio del corpo con il tipo di contenuto JSON, devi determinarlo nell'intestazione della richiesta.
Nel sistema operativo Windows, non è possibile determinare il corpo JSON utilizzando virgolette singole. Quindi prova questo invece:

curl -X POST \
-H  "Authorization: JWT <token>" \
-H "Content-Type: application/json" \
-d "{
                    \"title\": \"Helloooo\",
                    \"content\": \"Hi\",
                    \"schools\": null,
                    \"course\": null,
                    \"classes\": [
                        1
                    ],
                    \"isbn\": 12312,
                    \"semester\": null,
                    \"visible\": false

}" http://127.0.0.1:8000/api/posts/create/?type=post

RexFoxtrott Nov 18 2020 at 02:04

Grazie a Seyyed Sajjad Sanikhani ho risolto il mio problema alla fine, avevo effettivamente bisogno di specificare il tipo di contenuto utilizzando le virgolette giuste e il riempimento in PowerShell, il codice finale è finito per essere:

curl -X POST -H  "Authorization: JWT <token>" -H "Content-Type: application/json" -d '{
                 \"title\": \"Hello there\",
                     \"content\": \"high ground\",
                     \"schools\": "1",
                     \"course\": "1",
                     \"classes\": [
                         "1"
                     ],
                     \"isbn\": 12312,
                     \"semester\": "1",
                     \"visible\": true

 }' 'http://127.0.0.1:8000/api/posts/create/?type=post'

e poi finalmente l'output è stato:

{"title":"Hello there","content":"high ground","schools":1,"course":1,"classes":[1],"isbn":12312,"semester":1,"visible":true}

Quindi fai attenzione alla richiesta perché potresti finire per ricevere il seguente errore:

"detail": "JSON parse error - Expecting property name enclosed in double-quotes"

o

"[globbing] nested brace in column"