In this case the problem comes if the user also filled the other ~60
non-approved fields and has to start over, which makes this approach a
no-go for me :(

2015-05-27 10:25 GMT+02:00 James Schneider <[email protected]>:

> If you are able to catch the validation error, then perhaps you can
> redirect users back to the original form URL (since the form should have
> the new correct values on the next load).
>
> Check out the form.invalid() when working with the form directly or
> form_invalid() for CBV's. If you catch that specific error in
> form_invalid(), you can redirect the users back to the original form URL
> (hopefully with a message explaining what happened), which should display
> the form with the correct new value(s). However, this will also lose any
> other changes the user may have submitted.
>
> Alternatively, you can render the invalid form with updated values using
> the techniques you described, but you may need to do some dictionary
> digging to figure out where to change the value of the form. I'm on my
> phone so I can't check really, but I think changing the 'value' attribute
> on the failed form may work.
>
> Redirecting back to a clean version of the form with an error message is
> probably easiest, and can serve as a stop gap until you figure out the more
> desirable behavior.
>
> -James
> On May 27, 2015 12:47 AM, "Gergely Polonkai" <[email protected]> wrote:
>
>> Hello,
>>
>> although the data is from the database, the form itself is not a
>> ModelForm derivative. Also, this code you suggest will only modify the
>> model handling part of the form, thus, the user will see a value he
>> entered, although the database holds a different one.
>>
>> Best,
>> Gergely
>>
>> 2015-05-27 9:16 GMT+02:00 Klaas Feenstra <[email protected]>:
>>
>>> Hi,
>>>
>>> Maybe you can solve this in the views.py with commit=False
>>>
>>> https://docs.djangoproject.com/en/1.8/topics/forms/modelforms/
>>>
>>> And from here you can render the new form with the initial data
>>>
>>> # Create a form instance with POST data.>>> f = AuthorForm(request.POST)
>>> # Create, but don't save the new author instance.>>> new_author = 
>>> f.save(commit=False)
>>> # Modify the author in some way.>>> new_author.some_field = 'some_value'
>>> # Save the new instance.>>> new_author.save()
>>>
>>>
>>> On Wed, May 27, 2015 at 2:55 AM, Gergely Polonkai <[email protected]>
>>> wrote:
>>>
>>>> Hello,
>>>>
>>>> I'm currently having hard times changing a form field's value from
>>>> within the form's clean() method. I have already tried setting
>>>> self.initial[field_id] and manipulating the cleaned data by calling super's
>>>> clean method, change the required field (cleaned_data[field_id]) and
>>>> returning the modified dict, but all for no effect. Trying to change
>>>> self.data threw me an error saying data is immutable. Question is, is it
>>>> even possible, even if I had to tamper with ”protected/private”
>>>> properties/methods?
>>>>
>>>> Should I be on the wrong track, I try to outline the problem:
>>>>
>>>> I have a form with fields added programmatically in __init__(). The
>>>> value of these fields come from one of my models. It is highly possible
>>>> that another user puts one of the fields in approved state. If this
>>>> happens, I don't want the current user to be able to change its value,
>>>> hence I raise a validation error in the field's validate() method.
>>>>
>>>> Now comes the tricky part. In this particular case I want three things
>>>> to happen:
>>>>
>>>> • warn the user about the fact that the field has already been approved
>>>> (i.e. display the validation error message)
>>>> • render the input field as read only so the user can't modify it
>>>> (well, at least not in a trivial way)
>>>> • and revert the field's value to the one in the database
>>>>
>>>> However, in case of a validation error the field's value remains the
>>>> ”illegal” one the user just entered, and, as the input field is rendered
>>>> read only, there's no way for him to change it. Thus, I am trying to set it
>>>> during MyForm.clean() by walking through field errors looking form the
>>>> proper error code ('already_approved'), and once found, set it back to its
>>>> database value. This way I hope that my ValidationError remains (hence the
>>>> warning on the page) while resetting the unchangeable value so at the time
>>>> of the next submit it won't cause a problem.
>>>>
>>>> Kind regards,
>>>> Gergely
>>>>
>>>> --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "Django users" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>> an email to [email protected].
>>>> To post to this group, send email to [email protected].
>>>> Visit this group at http://groups.google.com/group/django-users.
>>>> To view this discussion on the web visit
>>>> https://groups.google.com/d/msgid/django-users/CACczBUK2EEaHBaS7bS%3DJF8Ce35MBkrwugtRvZCJC9E_Ovk2Rqg%40mail.gmail.com
>>>> <https://groups.google.com/d/msgid/django-users/CACczBUK2EEaHBaS7bS%3DJF8Ce35MBkrwugtRvZCJC9E_Ovk2Rqg%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>> .
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>
>>>  --
>>> You received this message because you are subscribed to the Google
>>> Groups "Django users" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>> To post to this group, send email to [email protected].
>>> Visit this group at http://groups.google.com/group/django-users.
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/django-users/CAJcivacMBoNMG4OMwwkg7CDyYzOccXjz-3it5OdD_Au0r0trzg%40mail.gmail.com
>>> <https://groups.google.com/d/msgid/django-users/CAJcivacMBoNMG4OMwwkg7CDyYzOccXjz-3it5OdD_Au0r0trzg%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>  --
>> You received this message because you are subscribed to the Google Groups
>> "Django users" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> To post to this group, send email to [email protected].
>> Visit this group at http://groups.google.com/group/django-users.
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/django-users/CACczBULF%2BDGgK1Rm%2BLJEsujO0ENZ9SDWvpBqZwog9zczG4C3_g%40mail.gmail.com
>> <https://groups.google.com/d/msgid/django-users/CACczBULF%2BDGgK1Rm%2BLJEsujO0ENZ9SDWvpBqZwog9zczG4C3_g%40mail.gmail.com?utm_medium=email&utm_source=footer>
>> .
>> For more options, visit https://groups.google.com/d/optout.
>>
>  --
> You received this message because you are subscribed to the Google Groups
> "Django users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/django-users.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/django-users/CA%2Be%2BciW4JJ0cA_GjPaVb_3jWbb8GOjzpJeRGzNgYKwh_GP%3DdxQ%40mail.gmail.com
> <https://groups.google.com/d/msgid/django-users/CA%2Be%2BciW4JJ0cA_GjPaVb_3jWbb8GOjzpJeRGzNgYKwh_GP%3DdxQ%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/CACczBUKeXahsZhkjRue4tAk1RXDaCwk%3DG6aPBWdhGJw%3D7fYj3g%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to