首页 > 解决方案 > 为什么上传图片后返回错误的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)

标签: djangodjango-modelsdjango-rest-frameworkdjango-views

解决方案


推荐阅读