Как правильно загружать файлы с помощью FileField в моделях и сериализаторах в Django Rest Framework?

Я делаю простое приложение DRF Login App, которое позволяет пользователю загружать CSV файл и его описание при регистрации. Оно работает нормально, но когда я загружаю файл, оно выдает ошибку The submitted data was not a file. Check the encoding type on the form..

Я искал в stackoverflow, но там есть вопросы, связанные только с ImageField (то есть с изображением), а не с FileField. Поэтому я не смог решить эту проблему.

Мой Models.py - это:

class Detail(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    file = models.FileField(verbose_name="CSV File", upload_to='csv_files')
    file_desc = models.TextField("CSV File Description")

    def __str__(self):
        return ("{} ({} {})".format(self.user.email, self.user.first_name, self.user.last_name))

Мой Serializers.py - это:

class MainRegisterSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'email', 'password')


class RegisterSerializer(serializers.ModelSerializer):
    register = MainRegisterSerializer()

    class Meta:
        model = Detail
        fields = ['register', 'file', 'file_desc']
        optional_fields = ['file', 'file_desc']
        extra_kwargs = {'password': {'write_only': True}}

    def create(self, validated_data):
        user = User.objects.create_user(validated_data['register']['username'], validated_data['register']['email'], validated_data['register']['password'])
        user.first_name = validated_data['register']['first_name']
        user.last_name = validated_data['register']['last_name']
        user.save()
        detail = Detail(user=user, file=validated_data['file'], file_desc=validated_data['file_desc'])
        detail.save()
        return user

Мой Views.py - это:

class RegisterAPI(APIView):
    renderer_classes = [TemplateHTMLRenderer]
    template_name = 'accounts/register.html'

    def get(self, request):        
        serializer = RegisterSerializer()
        return Response({'serializer': serializer})

    def post(self, request):
        serializer = RegisterSerializer(data=request.data)
        if not serializer.is_valid():
            return Response({'serializer': serializer})
        serializer.save()
        return redirect('register')

Мой template (register.html) - это:

{% load rest_framework %}

<html><body>

<h1>Register</h1>

<form action="#" method="POST">
    {% csrf_token %}
    {% render_form serializer %}
    <input type="submit" value="Save">
</form>

</body></html>

Я много чего перепробовал, но так и не смог понять, что я делаю не так. Любая помощь будет оценена по достоинству.

Вернуться на верх