def post(self, request, *args, **kwargs): formset = self.ModelFormSet(request.POST, prefix=self.formset_prefix) if formset.is_valid(): self.object.is_accepted = True self.object.save() for form in formset: instance = form.save(commit=False) instance.save() if 'nominations' in form.changed_data: nominations = [nomination.id for nomination in form.cleaned_data['nominations']] currents = instance.nominations.values_list( 'id', flat=True) removed_nominations = list( set(currents) - set(nominations)) added_nominations = list( set(nominations) - set(currents)) VideoNomination.objects.filter( participant_video=instance, nomination__in=removed_nominations).delete() VideoNomination.objects.bulk_create([ VideoNomination( nomination_id=nomination, participant_video=instance) for nomination in added_nominations]) notify_success(request, u'Данные сохранены') participant_reviewed.send(self, participant=self.object) return HttpResponseRedirect(self.get_success_url()) notify_error(request, u'При сохранении произошла ошибка') return self.render_to_response(self.get_context_data( form=self.get_form(self.get_form_class()), formset=formset))
def form_valid(self, form): MAX_WIDTH = 500 try: coords = json.loads(form.cleaned_data['avatar_coords']) except ValueError: coords = { 'x': 0, 'y': 0, 'x2': 175, 'y2': 175, } # Загружен ли уже аватар и мы только должны его обрезать? img = Image.open(self.request.FILES.get('logo', self.object.logo)) img = img.convert('RGB') # Если загружаемый аватар слишком маленький if img.size[0] < 175 or img.size[1] < 175: form_errors = form._errors.setdefault('logo', ErrorList()) form_errors.append( u'Размер изображения должен быть больше 175x175 пикселей.') notify_error(self.request, message=u''' Произошла ошибка при обновлении логотипа. Размер изображения должен быть больше 175x175 пикселей.''') return self.render_to_response(self.get_context_data(form=form)) # Если изображение слишком широкое, ужимаем if img.size[0] > MAX_WIDTH: aspect = img.size[0] / MAX_WIDTH new_height = int(round(img.size[1] / aspect)) # Вот с этим изображением мы и будем работать img = img.resize((MAX_WIDTH, new_height), Image.ANTIALIAS) # Иначе просто обрезаем cropped_image = img.crop((coords['x'], coords['y'], coords['x2'], coords['y2'])) cropped_image.thumbnail((175, 175), Image.ANTIALIAS) temp_handle = StringIO() cropped_image.save(temp_handle, 'jpeg', quality=100) temp_handle.seek(0) suf = SimpleUploadedFile( 'min.jpg', temp_handle.read(), content_type='image/jpg') self.object.min_logo.save('min.jpg', suf, save=False) form.save() notify_success(self.request, message=u'Логотип успешно обновлен.') return HttpResponseRedirect(self.get_success_url())