Я отправляю поле изображения с размерами кадрирования в django, чтобы отредактировать изображение перед сохранением. Часть редактирования и сохранения работает, но только когда я жестко запрограммировал требуемые размеры.
Моя проблема в том, что в модели размеры кадрирования не увеличиваются и отображаются как None.
Сохраняемая модель обрабатывается с использованием набора форм.
Размеры обрезки были добавлены позже, я не забыл перенести поля.
Вот мой код:
view.py
for i, form in enumerate(picture_formset_from_request.forms):
if form.is_valid():
form.save()
Из pycharm это будет файл, в который данные больше не передаются:
форма / models.py
def save(self, commit=True):
"""
Save this form's self.instance object if commit=True. Otherwise, add
a save_m2m() method to the form which can be called after the instance
is saved manually at a later time. Return the model instance.
"""
if self.errors:
raise ValueError(
"The %s could not be %s because the data didn't validate." % (
self.instance._meta.object_name,
'created' if self.instance._state.adding else 'changed',
)
)
if commit:
# If committing, save the instance and the m2m data immediately.
self.instance.save() # <- it seems to go wrong here
self._save_m2m()
else:
# If not committing, add a method to the form to allow deferred
# saving of m2m data.
self.save_m2m = self._save_m2m
return self.instance
save.alters_data = True
В строке self.instance.save () необходимые данные присутствуют в «cleanded_data», но в «экземпляре» все x, y, w, h отображаются как None.
x, y, w, h были добавлены позже в попытке обрезать фотографии перед сохранением вниз.
models.py
class LetterPicture(models.Model):
letter = models.ForeignKey(Letter, on_delete=models.CASCADE)
slot = models.IntegerField()
picture = models.ImageField(upload_to="letter_pictures/%Y/%m/%d", default="empty.jpg")
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
publish = models.DateTimeField(auto_now=True)
x = models.FloatField(null=True)
y = models.FloatField(null=True)
w = models.FloatField(null=True)
h = models.FloatField(null=True)
def save(self, *args, **kwargs):
self.set_image( # <- data not available here
desired_width=200,
desired_height=200
)
super().save(*args, **kwargs)
forms.py
class LetterPictureModelForm(forms.ModelForm):
picture = forms.ImageField(
label='Picture',
widget=ClearableFileInput(attrs={
'class': 'form-control',
'placeholder': 'Picture'
})
)
x = forms.FloatField(widget=forms.HiddenInput())
y = forms.FloatField(widget=forms.HiddenInput())
w = forms.FloatField(widget=forms.HiddenInput())
h = forms.FloatField(widget=forms.HiddenInput())
class Meta:
model = LetterPicture
fields = ['picture', 'x', 'y', 'w', 'h', ]
widgets = {
'letter': forms.HiddenInput(),
'slot': forms.HiddenInput(),
'x': forms.HiddenInput(),
'y': forms.HiddenInput(),
'w': forms.HiddenInput(),
'h': forms.HiddenInput(),
}
Я всего 4 недели в Django - так что мое понимание того, что именно я делаю, не совсем верно.
Что мешает полям x, y, w, h достичь модели во время сохранения?