Не все поля формы достигают модели во время сохранения - PullRequest
0 голосов
/ 11 июля 2019

Я отправляю поле изображения с размерами кадрирования в 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 достичь модели во время сохранения?

1 Ответ

0 голосов
/ 11 июля 2019

Я точно не знаю, в чем была проблема, но это была успешная работа, которая не выглядит слишком глупой:

if form.is_valid():
    letter_picture_pre_save = form.save(commit=False)
    letter_picture_pre_save.x = form.cleaned_data['x']
    letter_picture_pre_save.y = form.cleaned_data['y']
    letter_picture_pre_save.w = form.cleaned_data['w']
    letter_picture_pre_save.h = form.cleaned_data['h']
    letter_picture_pre_save.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...