Установить значение поля модели, которое не является частью формы модели

у меня такая модель

class Income(models.Model):
    value = models.DecimalField(max_digits=10, decimal_places=2)
    remitted = models.DecimalField(max_digits=10, decimal_places=2, default=0.00)

у меня вот такая форма

class EditIncomeForm(forms.ModelForm):
    class Meta:
        model = Income
        fields = ("value", )

        def clean_value(self):
           value = self.cleaned_data["value"]
            if self.value < self.remitted:
                raise forms.ValidationError("Error message")
            return value

Теперь в форме модели, как мне обновить значение поля remitted? Кажется, я не могу получить доступ к полю remitted таким образом. Я на Джанго 2.0


person chidimo    schedule 15.02.2018    source источник


Ответы (2)


Это не имеет ничего общего с тем, находится ли поле в форме или нет.

Вы делаете две вещи неправильно; во-первых, вы пытаетесь получить доступ к self.remitted вместо self.cleaned_data['remitted']; и, во-вторых, remitted не будет очищен в момент вызова clean_value.

Чтобы получить доступ к данным из нескольких полей, вместо этого переопределите основной метод clean():

 def clean(self):
      value = self.cleaned_data["value"]
      remitted = self.cleaned_data["remitted"]
      if value < remitted:
          self.add_error("value", "Error message")
person Daniel Roseman    schedule 15.02.2018
comment
как я понимаю remitted отсутствует в чистых данных - person Brown Bear; 15.02.2018
comment
Что заставляет вас думать, что? - person Daniel Roseman; 15.02.2018
comment
Но это не имеет никакого отношения к тому, что находится в clean_data, оно просто определяет, какие поля сохраняются в экземпляре. - person Daniel Roseman; 15.02.2018
comment
о, спасибо, я запутался в своих мыслях с сериализаторами drf - person Brown Bear; 15.02.2018
comment
@DanielRoseman Я попробую, когда у меня будет время. Но один вопрос. Должен ли я специально использовать self.add_error("value", "Error message") или мне следует использовать forms.ValidationError? - person chidimo; 15.02.2018
comment
В общем чистом методе вызов ValidationError приведет к тому, что он не будет связан с каким-либо конкретным полем, поэтому он будет отображаться в form.non_field_errors. Это зависит от того, важно ли это для вас. - person Daniel Roseman; 15.02.2018
comment
@DanielRoseman Я добавил ошибку в поле «значение» в форме. Теперь вопрос в том, как мне вызвать ошибку в шаблоне, чтобы предупредить пользователя о том, что что-то не так. - person chidimo; 15.02.2018
comment
@Bear Brown Думаю, сегодня мы оба узнали что-то новое об очистке поля формы. Ваше здоровье - person chidimo; 15.02.2018
comment
Хорошо. Я использовал {{ form.errors }} , но он не появился. Не могли бы вы посоветовать, как читать исходный код Django и? - person chidimo; 15.02.2018
comment
Если ошибка не появляется, значит что-то не так с вашим представлением и/или шаблоном; вы должны опубликовать их. - person Daniel Roseman; 15.02.2018
comment
Форма модели не вызывает метод clean(). Есть идеи. - person chidimo; 15.02.2018

Я кое-что прочитал о Проверка на ModelForm из документации и, наконец, я смог вызвать ошибку в форме. Полный код формы ниже.

Этот раздел особенно доказал быть тем, что мне нужно. В нем говорится:

Экземпляр формы модели, прикрепленный к объекту модели, будет содержать атрибут экземпляра, который дает его методам доступ к этому конкретному экземпляру модели.

class EditIncomeForm(forms.ModelForm):
    class Meta:
        model = Income
        fields = ("value", )

    def clean(self):
        value = self.cleaned_data['value']
        remitted = self.instance.remitted # access other model field.
        if value <= remitted:
            self.add_error("value", "Error message.")
person chidimo    schedule 15.02.2018