我不完全理解為什么我不能在我的 DRF api 中更新影像 url。我將 djoser 用于 api 端點和激活,django rest 框架和 vue.js 用于前端,axios 發出 API 請求。我相信(我可能錯了!)我無法使用 FormData() 向 Axios 發出補丁請求,所以通過谷歌搜索我找到了另一種方法,但我仍然收到 HTTP 500 錯誤和 Django 錯誤:
Internal Server Error: /api/v1/users/me/
Traceback (most recent call last):
File "/Users/markmckeon/Django_Stuff/Relate/environment_3_8_8/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/Users/markmckeon/Django_Stuff/Relate/environment_3_8_8/lib/python3.8/site-packages/django/core/handlers/base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/markmckeon/Django_Stuff/Relate/environment_3_8_8/lib/python3.8/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "/Users/markmckeon/Django_Stuff/Relate/environment_3_8_8/lib/python3.8/site-packages/rest_framework/viewsets.py", line 125, in view
return self.dispatch(request, *args, **kwargs)
File "/Users/markmckeon/Django_Stuff/Relate/environment_3_8_8/lib/python3.8/site-packages/rest_framework/views.py", line 509, in dispatch
response = self.handle_exception(exc)
File "/Users/markmckeon/Django_Stuff/Relate/environment_3_8_8/lib/python3.8/site-packages/rest_framework/views.py", line 469, in handle_exception
self.raise_uncaught_exception(exc)
File "/Users/markmckeon/Django_Stuff/Relate/environment_3_8_8/lib/python3.8/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
raise exc
File "/Users/markmckeon/Django_Stuff/Relate/environment_3_8_8/lib/python3.8/site-packages/rest_framework/views.py", line 506, in dispatch
response = handler(request, *args, **kwargs)
File "/Users/markmckeon/Django_Stuff/Relate/environment_3_8_8/lib/python3.8/site-packages/djoser/views.py", line 175, in me
return self.partial_update(request, *args, **kwargs)
File "/Users/markmckeon/Django_Stuff/Relate/environment_3_8_8/lib/python3.8/site-packages/rest_framework/mixins.py", line 82, in partial_update
return self.update(request, *args, **kwargs)
File "/Users/markmckeon/Django_Stuff/Relate/environment_3_8_8/lib/python3.8/site-packages/rest_framework/mixins.py", line 68, in update
self.perform_update(serializer)
File "/Users/markmckeon/Django_Stuff/Relate/environment_3_8_8/lib/python3.8/site-packages/djoser/views.py", line 149, in perform_update
super().perform_update(serializer)
File "/Users/markmckeon/Django_Stuff/Relate/environment_3_8_8/lib/python3.8/site-packages/rest_framework/mixins.py", line 78, in perform_update
serializer.save()
File "/Users/markmckeon/Django_Stuff/Relate/environment_3_8_8/lib/python3.8/site-packages/rest_framework/serializers.py", line 208, in save
assert self.instance is not None, (
AssertionError: `update()` did not return an object instance.
我不確定這是否是影像檔案處理方式的后端問題,還是前端提交檔案的方式?
這是我的serializers.py:
class UserSerializer(serializers.ModelSerializer):
profile = ProfileSerializer(required=False, allow_null=True)
class Meta:
model = User
fields = ['username', 'profile', 'password']
extra_kwargs = {"password":{'write_only': True}}
def update(self, instance, validated_data):
parser_classes = (MultiPartParser)
if 'profile' in validated_data:
nested_serializer = self.fields['profile']
nested_instance = instance.profile
nested_data = validated_data.pop('profile')
nested_serializer.update(nested_instance, nested_data)
return super(UserSerializer, self).update(instance, validated_data)
def create(self, validated_data):
return User.objects.create_user(**validated_data)
如您所見,我正在更新嵌套的用戶模型以將用戶組態檔和用戶詳細資訊保持在一起。
Vue.js:
methods: {
updateAvatar() {
const token = localStorage.getItem('token')
const image = this.fileName
const formData = new FormData();
const data = {
profile: {
avatar: image,
},
username: this.user_profile[0]["username"],
password: token
};
console.log("Pre send: ", data);
for(let dataKey in data) {
if(dataKey === 'avatar') {
// append nested object
for (let previewKey in data[dataKey]) {
formData.append(`avatar[${previewKey}]`, data[dataKey][previewKey]);
}
}
else {
formData.append(dataKey, data[dataKey]);
}
}
const base = {
baseURL: 'http://127.0.0.1:8000',
headers: {
"Content-Type": "multipart/form-data"
},
xhrFields: {
withCredentials: true
}
};
const axiosInstance = axios.create(base);
axiosInstance({
url: "/api/v1/users/me/",
data: formData,
method: "patch"
})
// axios
// .patch(`/api/v1/users/me/`, formData)
.then((response) => {
const newArray = response.data;
console.log("Userchanges: ", newArray);
})
.catch((error) => console.log(error.response));
}
},
最后是我的 DRF 用戶實體:

uj5u.com熱心網友回復:
嘗試super在您的方法中取消縮進呼叫update:
def update(self, instance, validated_data):
parser_classes = (MultiPartParser)
if 'profile' in validated_data:
...
# unindented
return super(UserSerializer, self).update(instance, validated_data)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/417277.html
標籤:
上一篇:更改單選按鈕更改的類
