私はViewSetsが初めてで、作成関数でフロントエンドのフェッチメソッドからDjangoのリクエストオブジェクトに送信された値を取得しようとしています。単純な構文エラーなのか、フロントエンドからデータが正しく送信されていないのかわかりませんが、バックエンドの問題だと思います。
post メソッドの文字列化されたデータは、次のテストのようにフロントエンドで正しくログに記録されているようです。
{"title":"test","type":"landing","slug":"","notes":""}
ただし、ViewSet の create 関数で変数を出力すると、次のように表示されます。
print(request.POST["title"]) # fails with keyerror: 'title' MultiValueDictKeyError(key) django.utils.datastructures.MultiValueDictKeyError: 'title'
print(request["title"]) # fails with TypeError: 'Request' object is not subscriptable
print(request.POST.get("title", “test”)) # fails as print test
print(request.POST.get("title")) # fails as it just returns None
print(request.get("title")) # fails with AttributeError: 'WSGIRequest' object has no attribute 'get'
print(self.request.query_params.get("title", None)) # prints None
print(self.request.query_params) # prints empty QueryDict: <QueryDict: {}>
作成関数は次のとおりです。
class PagesViewSet(viewsets.ViewSet):
def create(self, request):
# printing went here
page = Page.objects.create(
title="testing", type="other", slug="test-slug", notes="test notes"
)
serializer = PageSerializer(page)
return Response(serializer.data)
ページ作成メソッド内にデモデータを入れて、それが機能することを確認しましたが、実際にリクエストにあるはずの実際のデータを使用したいと考えています。
ここで何が問題なのか知っている人はいますか?
可視性のために、フロントエンド API リクエスト関数を次に示します。
const createPage = async (data: CreatePageFormInputs) => {
console.log('stringified: ', JSON.stringify(data)); // logs correctly
const res = await fetchCreatePage('http://localhost:8000/api/pages/', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data),
});
};
無関係かもしれませんが、何か疑問に思っている場合fetchCreatePage
は、カスタム 反応フックのこの部分にすぎません。
const fetchCreatePage: FetchDataFn = async (url, options?) => {
const setFailed = () => {
setFetchError(true);
setLoading(false);
};
const setSuccess = (data: any) => {
setData(data);
setLoading(false);
};
try {
setLoading(true);
const res = await fetch(url, options);
if (!res.ok) {
console.log('Error detected. Returning...');
setFailed();
return;
}
if (res.status === 204) {
setSuccess({
success: true,
info: 'Item successfully deleted',
});
return;
}
const data = await res.json();
setSuccess(data);
} catch (e) {
setFailed();
}
}
POST メソッドは正しいと思います。どんな助けでも感謝します、ありがとう。