angularjs - Overriding validation for Django for base64 string for model.imagefield -
i using angular , bootstrap serve forms. if user uploads image, angular serves in "data:" format, django looking file type. have fixed issue overriding both perform_authentication (to modify image file) , perform_create (to inject user_id). there better way override?
i'd rather not override view. i'd rather override way django validates imagefields. want check if passed value 64-bit string, if is, modify file type, validate imagefield. below code works is, don't feel optimal.
here view:
class usercredentiallist(generics.listcreateapiview): permission_classes = (iscredentialowneroradmin,) serializer_class = credentialserializer """ view should return list of purchases authenticated user. """ def get_queryset(self): """ view should return list of models maker passed in url """ user = self.request.user return credential.objects.filter(member=user) def perform_create(self, serializer): serializer.save(member_id=self.request.user.id) def perform_authentication(self, request): if request.method == 'post': data = request.data.pop('document_image', none) django.core.files.base import contentfile import base64 import 6 import uuid # check if base64 string if isinstance(data, six.string_types): # check if base64 string in "data:" format if 'data:' in data , ';base64,' in data: # break out header base64 content header, data = data.split(';base64,') # try decode file. return validation error if fails. try: decoded_file = base64.b64decode(data) except typeerror: self.fail('invalid_image') # generate file name: file_name = str(uuid.uuid4())[:12] # 12 characters more enough. # file name extension: import imghdr file_extension = imghdr.what(file_name, decoded_file) file_extension = "jpg" if file_extension == "jpeg" else file_extension complete_file_name = "%s.%s" % (file_name, file_extension,) data = contentfile(decoded_file, name=complete_file_name) request.data['document_image'] = data request.user and here serializer:
class credentialserializer(serializers.modelserializer): class meta: model = credential fields = ( 'id', 'credential_type', 'credential_number', 'date_received', 'is_verified', 'date_verified', 'document_image', ) and here model:
class credential(models.model): """used store various credentials member validation.""" document_image = models.imagefield( upload_to=get_upload_path(instance="instance", filename="filename.ext", path='images/credentials/')) passenger = 'p' owner = 'o' captain = 'c' credential_choices = ( (passenger, 'passenger'), (owner, 'owner'), (captain, 'captain'), ) credential_type = models.charfield(max_length=1, choices=credential_choices, default=passenger) credential_number = models.charfield(max_length=255) date_received = models.datetimefield(auto_now_add=true) is_verified = models.booleanfield(default=false) date_verified = models.datetimefield(blank=true, null=true) member = models.foreignkey(settings.auth_user_model, related_name='credentials') i used below link me, want figure out how override proper method django rest framework upload image: "the submitted data not file"
well i've made 1 change since making: have moved function serializer , instead override method: is_valid , works well. @ least it's not in view anymore.
Comments
Post a Comment