django - 为什么上传图片后返回错误的url
问题描述
我上传了图像,它被保存在正确的位置,并将 URL 上传到数据库。但反应是错误的。正在返回“http://127.0.0.1:8000/media/media/img.jpg”而不是保存它的“http://127.0.0.1:8000/media/img.jpg”。为什么要添加额外的媒体/?
api.js
class RegisterAPI(generics.GenericAPIView):
serializer_class = RegisterSerializer
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.save()
if request.FILES['profile_pic']:
myfile = request.FILES['profile_pic']
fs = FileSystemStorage()
filename = fs.save(myfile.name, myfile)
uploaded_file_url = fs.url(filename)
profile = UserDetail()
profile.user = user
profile.profile_pic = uploaded_file_url
profile.save()
return Response({
"user": UserSerializer(user, context=self.get_serializer_context()).data,
"token": AuthToken.objects.create(user)[1]
})
url.js
urlpatterns = [
path('api/auth', include('knox.urls')),
path('api/auth/register', RegisterAPI.as_view()),
path('api/auth/login', LoginAPI.as_view()),
path('api/auth/user', UserAPI.as_view()),
path('api/auth/logout', knox_views.LogoutView.as_view(),name='knox-logout'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
设置.js
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/images')
串行器
class ProfilePicSerializer(serializers.ModelSerializer):
class Meta:
model = UserDetail
fields = '__all__'
class RegisterSerializer(serializers.ModelSerializer):
profile_pic = ProfilePicSerializer(source='user_detail', read_only=True)
class Meta:
model = User
fields = ('id', 'username', 'email', 'password', 'first_name', 'last_name', 'profile_pic')
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
user = User.objects.create_user(
validated_data['username'],
validated_data['email'],
validated_data['password'],
first_name=validated_data['first_name'],
last_name=validated_data['last_name'],
# is_staff=True
)
return user
用户细节模型
class UserDetail(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE,related_name='user_detail')
profile_pic = models.ImageField(null=True, blank=True)
解决方案
推荐阅读
- css - 为什么没有 > 这段 CSS 代码不起作用
- python - 如何减小 keras 保存模型的大小?
- python - Python pandas 数据框和列表合并
- r - 为什么在使用 library(MASS) 与 MASS:: 时会得到不同的结果?
- python - 有没有办法通过 mixin 设置 peewee 字段?
- python - 如何使用“重复且唯一”制作新列
- angular - 创建新的 Angular 项目 - 包安装失败
- groovy - 嵌套 json 中的断言计数
- javascript - 像wilio这样的Vue向导形式
- angular - 如何在离子吐司中添加“路由器链接”