Как правильно загружать файлы с помощью 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>
Я много чего перепробовал, но так и не смог понять, что я делаю не так. Любая помощь будет оценена по достоинству.