Django изменить данные формы в чистом методе - PullRequest
9 голосов
/ 11 марта 2011

У меня есть форма django, которую я хочу очистить.Вместо того, чтобы просто указывать сообщение об ошибке, как здесь ( Форма Django и проверка поля ), я хотел бы просто изменить поле самостоятельно.Я пробовал несколько способов, но продолжаю сталкиваться с ошибками, как cleaned_data является неизменным.

Поэтому, чтобы решить эту проблему, я сделал копию, изменил ее и переназначил на себя.Это лучший способ сделать это?Мог / должен ли я справиться с этим в представлении?Создание копии кажется плохой формой, но я продолжаю сталкиваться с «неизменными» препятствиями.Пример кода ниже, где я просто проверяю, есть ли у субъекта '--help' в конце, и если нет, добавьте его.Спасибо

def clean(self):
        cleaned_data=self.cleaned_data.copy()
        subject=cleaned_data.get['subject']
        if not subject.endswith('--help'):
            cleaned_data['subject']=subject+='--help'
        self.cleaned_data=cleaned_data
        return self.cleaned_data

Ответы [ 4 ]

12 голосов
/ 11 марта 2011

Правильный способ справиться с этим - использовать чистые методы, специфичные для поля.

Что бы вы не вернули из метода clean_FOO, это то, чем будет заполнен cleaned_data к тому времени, когда он перейдет к функции clean.

Вместо этого выполните следующие действия:

def clean_subject(self):
        data = self.cleaned_data.get('subject', '')
        if not data:
             raise forms.ValidationError("You must enter a subject")
             # if you don't want this functionality, just remove it.

        if not data.endswith('--help'):
             return data += '--help'
        return data
5 голосов
/ 07 августа 2015

Итак, я обнаружил, что это недавно погуглило, возможно, на ту же проблему, когда в экземпляре формы ModelForm я пытался отредактировать данные после проверки, чтобы предложить конечному пользователю предложение относительно того, что будетдействительный ответ (вычисляется из другого значения, которое они вводят в форму).

TL: DR;в том, что если вы имеете дело с потомком ModelForm, есть две важные вещи:

  1. Вы должны вызвать super(YourModelFormClass, self).clean(), чтобы проверялись уникальные поля.
  2. Это (наиболее актуально для этого вопроса), что если вы редактируете cleaned_data, вы также должны отредактировать то же поле в экземпляре вашей модели, которое прикреплено к вашей ModelForm:

    def clean(self)
      self.cleaned_data = super(MyModelFormClass, self).clean()
      self.cleaned_data['name']='My suggested value'
      self.instance.name = 'My suggested value'
      return self.cleaned_data
    

Источник документации для этого поведения

РЕДАКТИРОВАТЬ:

Вопреки документации, я только что обнаружил, что это не работает.Вы должны отредактировать self.data формы, чтобы изменения отображались при отображении формы.

3 голосов
/ 11 марта 2011

Я думаю, что ваша проблема в том, что вы вызвали self.cleaned_data.get['subject'], а затем использовали его как массив.

У меня есть этот код для приложения обмена сообщениями, которое заменяет пустую тему на «Нет темы»

def clean(self):
    super(forms.ModelForm, self).clean()
    subject = self.cleaned_data['subject']
    if subject.isspace():
        self.cleaned_data['subject'] = 'No Subject'
    return self.cleaned_data

Для вашего кода это должно работать.

def clean(self):
    super(forms.Form, self).clean() #I would always do this for forms.
    subject = self.cleaned_data['subject']
    if not subject.endswith('--help'):
        subject += '--help'
        self.cleaned_data['subject'] = subject
    return self.cleaned_data
0 голосов
/ 09 января 2013

"Этот метод должен возвращать очищенное значение, полученное из cleaned_data, независимо от того, изменилось ли оно что-нибудь или нет." от https://docs.djangoproject.com/en/dev/ref/forms/validation/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...