2010-03-12 3 views
6

Как установить значение элемента поля после отправки формы, но не удалось выполнить проверку? напримерНачальное значение поля формы Django при неудачной проверке

if form.is_valid(): 
    form.save() 
else: 
    form.data['my_field'] = 'some different data' 

Я действительно не хочу ставить его в точку зрения и, скорее, иметь его как часть класса формы.

Благодаря

ответ

5

я в конечном итоге делаю

if request.method == 'POST': 
    new_data = request.POST.copy() 
    form = MyForm(data=new_data) 
    if form.is_valid(): 
     form.save() 
    else: 
     new_data['myField'] = 'some different data' 

Надеется, что это помогает кому-то

13

documentation говорит:

Если у вас есть связанного экземпляра формы и хотите изменить данные, или если вы хотите связать экземпляр несвязанной формы с некоторыми данными, создать другой экземпляр формы. Существует нет возможности изменить данные в экземпляре формы. После того, как экземпляр формы был создан, вы должны учитывать его данные неизменяемые, имеет ли он данные или нет.

Я не могу поверить, что ваш код работает. Но хорошо. На основе документации, я хотел бы сделать это следующим образом:

if request.method == 'POST': 
    data = request.POST.copy() 
    form = MyForm(data) 
    if form.is_valid(): 
     form.save() 
    else: 
     data['myField'] = 'some different data' 
     form = MyForm(initial=data) 
+3

Отличное решение. Если вы хотите сохранить ошибки в виде vaildated, вы можете использовать 'new_form = MyForm (initial = data) new_form._errors = form._errors form = new_form' – Michael

0

Вы можете поместить его в классе формы, как это:

class MyForm(forms.Form): 

    MY_VALUE = 'SOMETHING' 
    myfield = forms.CharField(
     initial=MY_VALUE, 
     widget=forms.TextInput(attrs={'disabled': 'disabled'}) 

    def __init__(self, *args, **kwargs): 

     # If the form has been submitted, populate the disabled field 
     if 'data' in kwargs: 
      data = kwargs['data'].copy() 
      self.prefix = kwargs.get('prefix') 
      data[self.add_prefix('myfield')] = MY_VALUE 
      kwargs['data'] = data 

     super(MyForm, self).__init__(*args, **kwargs) 

Как это работает, он проверяет, является ли какие-либо данные есть был передан конструктору формы. Если он есть, он копирует его (необработанные данные неизменяемы), а затем помещает начальное значение в значение, прежде чем продолжать создавать экземпляр формы.

Смежные вопросы